본문 바로가기

모바일 프로그래밍(Android Studio)

네트워크 통신을 통해 서버로부터 데이터 받기

1. 안드로이드 네트워크 통신을 위한 Volley 라이브러리 이용하기

○ 네트워크 통신관련 2개 라이브러리 추천받았다

- Volley(카카오톡이 아마 쓰고 있을 것이다) → 예전 프로젝트들은 이 라이브러리를 쓰고있을 것이다
- Retrofit2 →최근 프로젝트는 이 라이브러리를 쓴다

Volley 라이브러리: https://google.github.io/volley/

 

Volley overview

Volley overview Volley is an HTTP library that makes networking for Android apps easier and most importantly, faster. Volley is available on GitHub. Volley offers the following benefits: Automatic scheduling of network requests. Multiple concurrent network

google.github.io

맨 마지막 줄처럼 Volley라이브러리를 추가해준다

2. 안드로이드 네트워크 통신을 위한 AndroidManifest.xml파일 설정하기

<uses-permission android:name="android.permission.INTERNET" />

위의 코드를 추가해준다

※ 에뮬레이터에서 네트워크 통신 되도록 설정하는 방법※

1. res/xml 폴더안에, network_security_config.xml 파일 만든다

▷ 참고로 무료 가상 서버를 이용할것이기 때문에 domain 부분에 위에처럼 넣어준다.

무료 가상 서버: https://jsonplaceholder.typicode.com/ 

2.AndroidManiFest에 인터넷 권한 준다

밑에 2개의 코드는 application 부분에 넣는다

android:networkSecurityConfig="@xml/network_security_config"
android:usesCleartextTraffic="true"

3. JSON 데이터 파싱(parsing, 안에 있는 데이터를 끄집어내는걸 말한다)하기

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/txtUserId"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:layout_marginTop="79dp"
        android:text="TextView"
        android:textSize="28sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/txtId"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:layout_marginTop="58dp"
        android:text="TextView"
        android:textSize="28sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/txtUserId" />

    <TextView
        android:id="@+id/txtTitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:layout_marginTop="79dp"
        android:text="TextView"
        android:textSize="28sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/txtId" />

    <TextView
        android:id="@+id/txtBody"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:layout_marginTop="81dp"
        android:text="TextView"
        android:textSize="28sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/txtTitle" />
</androidx.constraintlayout.widget.ConstraintLayout>

package com.example.networkapp1;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonArrayRequest;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class MainActivity extends AppCompatActivity {

    TextView txtUserId;
    TextView txtId;
    TextView txtTitle;
    TextView txtBody;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        txtUserId = findViewById(R.id.txtUserId);
        txtId = findViewById(R.id.txtId);
        txtTitle = findViewById(R.id.txtTitle);
        txtBody = findViewById(R.id.txtBody);

        // 네트워크 통신을 위한 Volley 라이브러리 사용
        RequestQueue queue = Volley.newRequestQueue(MainActivity.this);

        // Request 요청을 만들어야한다
        JsonObjectRequest request = new JsonObjectRequest(
                Request.Method.GET,
                "https://jsonplaceholder.typicode.com/posts/7",
                null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) { // 네트워크로 제대로 받았을 때
                        // 1. 데이터를 가져오는 작업

                        try {
                            int userId = response.getInt("userId");
                            int id = response.getInt("id");
                            String title = response.getString("title");
                            String body = response.getString("body");
                            // 2. 화면에 보여주는 작업
                            txtUserId.setText(userId+""); // userId랑 id는 int형이라 문자열로 바꿔야한다
                            txtId.setText(id+"");
                            txtTitle.setText(title);
                            txtBody.setText(body);
                        } catch (JSONException e) {
                            Log.i("Mainactivity", e.toString());
                            Toast.makeText(MainActivity.this,"네트워크 통신 중 문제 발생",
                            Toast.LENGTH_SHORT).show();
                            return;
                        }

                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {

                    }
                }// 데이터 받아왔을 때 실행할 코드
        );
        JsonArrayRequest request1 = new JsonArrayRequest(
                Request.Method.GET,
                "https://jsonplaceholder.typicode.com/posts",
                null,
                new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(JSONArray response) {
                        try {
                            // JSONObject jsonObject = response.getJSONObject(0); 이 줄의 코드 안쓰고 밑에 처럼 한줄에 써줄수도 있다
                            int userId = response.getJSONObject(0).getInt("userId");
                            int id = response.getJSONObject(0).getInt("id");
                            String title = response.getJSONObject(0).getString("title");
                            String body = response.getJSONObject(0).getString("body");

                            txtUserId.setText(userId+""); // userId랑 id는 int형이라 문자열로 바꿔야한다
                            txtId.setText(id+"");
                            txtTitle.setText(title);
                            txtBody.setText(body);

                        } catch (JSONException e) {
                            return;
                        }
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {

                    }
                }
        );
        queue.add(request1);
    }
}

▶ JSON이 어떤형태이냐에따라 넣어야 할 코드가 다르다

이렇게 { }만 있는 형태는 JsonObject라고 한다.

이렇게 [ ] 안에 { }가 있는 형태는 JsonArray라고 한다.

▶try~catch문을 이용해야하는데 주의할 점이 있다!
try안에 로컬변수 만들었을때 같은 함수 안에서 쓰려고해도 안된다는 것이다 왜나하면 try문 밖에서는 못쓰기 때문!

해결방법은 2가지가 있다.
1. try안에 다 같이 넣어준다
2. try 밖에 만들어준다