본문 바로가기

FrontEnd/Android 기초

[Android] 네트워크 통신을 위한 Volley 라이브러리

반응형

Volley 라이브러리

Volley 라이브러리는 안드로이드 애플리케이션을 위한 네트워킹을 보다 쉽고 빠르게 만들어주는 HTTP 라이브러리이다.

Volley는 웹 요청과 응답을 단순화 시키기 위해 만들어진 라이브러리 중 하나로서, 그 중에서도 retrofit2d와 같이 가장 많이 사용되는 라이브러리이다.

 

Volley의 장점:

  • 네트워크 요청의 자동 예약
  • 여러개의 동시 네트워크 연결
  • 표준 HTTP 캐시 일관성을 갖춘 투명한 디스크 및 메모리 응답 캐싱
  • 요청(Request)의 우선순위 자동으로 관리
  • 취소 요청 API
  • 강력한 정렬기능을 이용해 네트워크에서 비동기식으로 가져온 데이터로 UI를 올바로 채우는 작업을 쉽게 실행함 

 

Volley 사용법

 

 

안드로이드 앱에서 API 서버를 요청한다하면,

  • Volley의 작동 구조는, 먼저 Request 요청 객체를 만들고, 이 요청객체를 requestQueue(요청 큐)에 넣어주면 이 requestQueue가 자동으로 웹서버에 요청을 해주고, 응답을 받아 사용자가 사용할 수 있게 지정된 메소드를 호출해준다.
  • 응답이 오면, request객체의 Listener에 구현을 하면 알맞게 처리해준다.
  •  request를 만들어야 하는데, Json으로 통신하기 때문에, JsonObjectrequest 클래스를 객체 생성한다.



Volley Android 개발자 문서:

https://developer.android.com/training/volley?hl=ko

 

Volley 깃허브 문서:

https://github.com/google/volley

 

Volley 공식 문서:

https://google.github.io/volley/



안드로이드 스튜디오 좌측 > Gradle Scripts > build.gradle > dependencies > 붙여넣기

implementation 'com.android.volley:volley:1.2.1'

-> Sync Now

 

또한, 인터넷을 사용하므로, AndroidManifest.xml에 하기 권한을 추가한다.

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

 

예제: 가수와 노래제목을 입력하면 가사가 나오게하는 API

 

무료로 가사를 가져올 수 있는 사이트(API 제공)

https://lyrics.ovh/

 

(완성된 예제)

 

코드는 하기 참고:

activity_main.xml

더보기
<?xml version="1.0" encoding="utf-8"?>


   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">

   <LinearLayout
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:orientation="vertical"
       app:layout_constraintBottom_toBottomOf="parent"
       app:layout_constraintEnd_toEndOf="parent"
       app:layout_constraintStart_toStartOf="parent"
       app:layout_constraintTop_toTopOf="parent">

       <EditText
           android:id="@+id/editName"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:layout_margin="10dp"
           android:ems="10"
           android:hint="가수이름"
           android:inputType="textPersonName"
           android:textSize="28sp" />

       <EditText
           android:id="@+id/editSong"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:layout_margin="10dp"
           android:ems="10"
           android:hint="노래명"
           android:inputType="textPersonName"
           android:textSize="28sp" />

       <Button
           android:id="@+id/btnLyrics"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:layout_margin="10dp"
           android:text="가사 가져오기!"
           android:textSize="28sp" />

       <TextView
           android:id="@+id/txtLyrics"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:layout_margin="10dp"
           android:text="TextView"
           android:textSize="28sp" />
   </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

 

MainActivity

더보기
package com.000.lyrics;

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.android.volley.DefaultRetryPolicy;
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.JsonObjectRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONObject;

public class MainActivity extends AppCompatActivity {

   EditText editName;
   EditText editSong;
   Button btnLyrics;
   TextView txtLyrics;

   final String URL = "https://api.lyrics.ovh/v1/";

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

       editName = findViewById(R.id.editName);
       editSong = findViewById(R.id.editSong);
       btnLyrics = findViewById(R.id.btnLyrics);
       txtLyrics = findViewById(R.id.txtLyrics);

       // 가사가져오기 버튼 누르면
       // 네트워크를 틍해 API 를 호출하고,
       // 호출한 결과를 화면에 표시한다.

       btnLyrics.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View view) {
               // 1. 버튼을 누르면, 에디트텍스트에서 유저가 입력한 문자열을
               //    가지고 온다.
               String name = editName.getText().toString().trim();
               String song = editSong.getText().toString().trim();

               // 1-1. 이름과 노래는 데이터가 꼭 있어야 한다. 둘중에 하나라도
               // 데이터가 없으면, 유저한테 둘다 필수로 입력하라고 알려준다.
               if(name.isEmpty() || song.isEmpty() ){
                   Toast.makeText(getApplicationContext(), "이름이나 노래제목은 필수로 입력하세요.", Toast.LENGTH_SHORT).show();
                   return;
               }

               // 2. 해당 데이터들을 조합하여 API를 호출한다.
               String apiUrl = URL + name + "/" + song;

               RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
               // 네트워크 통신을 위한 Request 를 만들어야 하는데,
               // JSON 으로 통신하기 때문에
               // JsonObjectRequest 클래스를 객체 생성한다.
               // 생성자는 :  http 메소드, API URL, 전달할 데이터, 응답받으면 실행할 코드, 에러를 받으면 실행할 코드
               JsonObjectRequest jsonObjectRequest =
                       new JsonObjectRequest(Request.Method.GET, apiUrl, null, new Response.Listener<JSONObject>() {

                           @Override
                           public void onResponse(JSONObject response) {

                               // 3. 서버로부터 응답(Response)를 받아서, 텍스트뷰에 표시한다.

                               // API를 호출한 결과가 여기서 실행된다.
                               // 따라서 우리는 여기에다가, 가사를 화면에 보여주는 코드를 작성.
                               // 즉, txtLyrics 에 가사를 보여준다.

                               Log.i("MyLyrics", response.toString());
                               txtLyrics.setText(response.toString());}
                       }, new Response.ErrorListener() {
                           @Override
                           public void onErrorResponse(VolleyError error) {
                               Log.i("MyLyrics", error.toString());
                           }
                       });

               // 네트워크를 통해서 데이터를 가져올때
               // 시간이 오래 걸리면,
               // 타임아웃값을 늘려준다.
               jsonObjectRequest.setRetryPolicy(new DefaultRetryPolicy(60000,
                       DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                       DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
               requestQueue.add(jsonObjectRequest);
           }
       });
   }
}

 

Androidmanifest.xml

더보기
<?xml version="1.0" encoding="utf-8"?>


   xmlns:tools="http://schemas.android.com/tools"
   package="com.000.lyrics"
   android:targetSandboxVersion="1">

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

   <application
       android:usesCleartextTraffic="true"
       android:networkSecurityConfig="@xml/network_security_config"
       android:allowBackup="true"
       android:dataExtractionRules="@xml/data_extraction_rules"
       android:fullBackupContent="@xml/backup_rules"
       android:icon="@mipmap/ic_launcher"
       android:label="@string/app_name"
       android:roundIcon="@mipmap/ic_launcher_round"
       android:supportsRtl="true"
       android:theme="@style/Theme.Lyrics"
       tools:targetApi="31">
       <activity
           android:name=".MainActivity"
           android:exported="true">
           <intent-filter>
               <action android:name="android.intent.action.MAIN" />

               <category android:name="android.intent.category.LAUNCHER" />
           </intent-filter>
       </activity>
   </application>

</manifest>

 

res> xml> new file 생성

network_security_config.xml

더보기
<?xml version="1.0" encoding="utf-8" ?>

<network-security-config>
   <domain-config cleartextTrafficPermitted="false">
       <domain includeSubdomains="true">*.lyrics.ovh</domain>
   </domain-config>
</network-security-config>

 

 

참고: 

https://velog.io/@dlrmwl15/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-Volley%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-HTTP-%ED%86%B5%EC%8B%A0


반응형