Computer >> 컴퓨터 >  >> 프로그래밍 >> Android

안드로이드 Volley로 JSON 배열을 받아 AbstractList에 담고 정렬하는 방법

개요

이 튜토리얼에서는 안드로이드에서 Volley 라이브러리를 사용해 서버로부터 JSON 배열 형태의 데이터를 받아온 뒤, 이를 AbstractList에 저장하고 정렬하여 화면에 출력하는 방법을 단계별로 살펴봅니다.

Volley는 HTTP 요청 처리와 응답 파싱을 간편하게 해주는 안드로이드 네트워킹 라이브러리입니다. AbstractList는 Java 컬렉션 프레임워크의 추상 클래스로, List 인터페이스의 기본 골격을 제공하며 실제 구현체인 ArrayList 등으로 인스턴스화해 사용할 수 있습니다.

1단계: 새 프로젝트 생성

Android Studio에서 File → New Project 메뉴로 이동한 후, 새 프로젝트 생성에 필요한 모든 정보를 입력하여 프로젝트를 만듭니다.

2단계: 레이아웃 작성

res/layout/activity_main.xml 파일에 다음 코드를 추가합니다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
   xmlns:app="https://schemas.android.com/apk/res-auto"
   xmlns:tools="https://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:gravity="center"
   android:layout_height="match_parent"
   tools:context=".MainActivity">
   <TextView
      android:id="@+id/text"
      android:textSize="30sp"
      android:layout_width="match_parent"
      android:layout_height="match_parent" />
</LinearLayout>

위 코드에서는 AbstractList에 담긴 항목(사용자 정보)을 화면에 표시하기 위해 TextView를 배치했습니다.

3단계: MainActivity 작성

src/MainActivity.java 파일에 다음 코드를 추가합니다.

package com.example.myapplication;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.TextView;
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.StringRequest;
import com.android.volley.toolbox.Volley;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.AbstractList;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class MainActivity extends AppCompatActivity {
   TextView textView;
   RequestQueue queue;
   String URL = "https://www.mocky.io/v2/597c41390f0000d002f4dbd1";
   @RequiresApi(api = Build.VERSION_CODES.N)
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      textView = findViewById(R.id.text);
      final AbstractList<UserInfo> list=new ArrayList<>();
      queue = Volley.newRequestQueue(this);
      StringRequest request = new StringRequest(Request.Method.GET, URL, new Response.Listener<String>() {
         @Override
         public void onResponse(String response) {
            try {
               JSONObject object=new JSONObject(response);
               JSONArray array=object.getJSONArray("users");
               for(int i=0;i<array.length();i++) {
                  JSONObject object1=array.getJSONObject(i);
                  String name =object1.getString("name");
                  String id =object1.getString("id");
                  list.add(new UserInfo(name,id));
               }
               Collections.sort(list, new Comparator<UserInfo>() {
                  @Override
                  public int compare(UserInfo o1, UserInfo o2) {
                     return o1.id.compareTo(o2.id);
                  }
               });
               textView.setText("id: "+list.get(0).id+ " \nname: "+list.get(0).name);
            } catch (JSONException e) {
               e.printStackTrace();
            }
         }
      }, new Response.ErrorListener() {
         @Override
         public void onErrorResponse(VolleyError error) {
            Log.d("error",error.toString());
         }
      });
      queue.add(request);
   }
   private class UserInfo {
      String name,id;
      public UserInfo(String name, String id) {
         this.name=name;
         this.id=id;
      }
   }
}

위 코드의 핵심 흐름은 다음과 같습니다.

  • Volley의 RequestQueue를 생성하고 StringRequest로 GET 요청을 전송합니다.
  • 응답으로 받은 JSON 문자열을 JSONObject로 변환한 뒤, "users" 키로 JSONArray를 추출합니다.
  • 배열을 순회하며 각 사용자의 name과 id 값을 읽어 UserInfo 객체로 만들고 AbstractList에 추가합니다.
  • Collections.sort()Comparator를 사용해 id를 기준으로 목록을 오름차순 정렬합니다.
  • 정렬된 목록의 첫 번째 항목(id와 name)을 TextView에 출력합니다.

참고로 URL에 사용된 mocky.io는 테스트용 목(Mock) API 서비스로, 실제 개발 시에는 자신의 백엔드 API 주소로 교체하면 됩니다.

4단계: 매니페스트 설정

AndroidManifest.xml 파일에 다음 코드를 추가합니다. 네트워크 통신이 필요하므로 반드시 INTERNET 권한을 선언해야 합니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
   package="com.example.myapplication">
   <uses-permission android:name="android.permission.INTERNET" />
   <application
      android:allowBackup="true"
      android:icon="@mipmap/ic_launcher"
      android:label="@string/app_name"
      android:roundIcon="@mipmap/ic_launcher_round"
      android:supportsRtl="true"
      android:theme="@style/AppTheme">
      <activity android:name=".MainActivity">
         <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            <category android:name="android.intent.category.LAUNCHER" />
         </intent-filter>
      </activity>
   </application>
</manifest>

5단계: Gradle 의존성 추가

build.gradle 파일에 다음 코드를 추가합니다. Volley 라이브러리 의존성(com.android.volley:volley:1.1.0)을 반드시 포함시켜야 합니다.

apply plugin: 'com.android.application'
android {
   compileSdkVersion 28
   defaultConfig {
      applicationId "com.example.myapplication"
      minSdkVersion 15
      targetSdkVersion 28
      versionCode 1
      versionName "1.0"
      testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
   }
   buildTypes {
      release {
         minifyEnabled false
         proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
      }
   }
}
dependencies {
   implementation fileTree(dir: 'libs', include: ['*.jar'])
   implementation 'com.android.volley:volley:1.1.0'
   implementation 'com.android.support:appcompat-v7:28.0.0'
   implementation 'com.android.support.constraint:constraint-layout:1.1.3'
   testImplementation 'junit:junit:4.12'
   androidTestImplementation 'com.android.support.test:runner:1.0.2'
   androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

앱 실행 및 결과 확인

이제 애플리케이션을 실행해 보겠습니다. 실제 안드로이드 기기가 컴퓨터에 연결되어 있다고 가정합니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤, 툴바의 Run 아이콘을 클릭하세요. 실행 대상으로 자신의 모바일 기기를 선택하면, 기기 화면에 아래와 같은 결과가 표시됩니다.

안드로이드 Volley로 JSON 배열을 받아 AbstractList에 담고 정렬하는 방법