관리 메뉴

막내의 막무가내 프로그래밍 & 일상

[안드로이드] Volley 라이브러리 사용법 본문

안드로이드/자바 & Previous

[안드로이드] Volley 라이브러리 사용법

막무가내막내 2019. 3. 9. 14:36
728x90

출처 및 참고:

https://www.edwith.org/boostcourse-android/lecture/17091/


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

implementation 'com.android.volley:volley:1.1.0' 추가해야합니다.


또한 manifests에 <uses-permission android:name="android.permission.INTERNET"/>  도 추가해줘야 기능을 사용할 수 있습니다.


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


장점은 앞서 말한것처럼 사용자가 직접 스레드 핸들러를 사용해서 네트워킹을 구현하지 않아도 되므로 훨씬 편하고 코드 양도 줄고 빠르게 작업할 수 있다는 장점이 있습니다.


Volley의 구조를 간단히 살펴보면 Request 요청객체를 만들고 이 요청객체를 requestQueue(요청 큐)에 넣어주면 이 requestQueue가 자동으로 웹서버에 요청을 해주고 응답을 받아줍니다. 

응답이 오면 처리해주는건 request객체의 Listener에 구현을 하면 알맞게 처리해줍니다.


=======================================

이러한 장점들을 정리해보자면 다음과 같습니다.


  • 네트워크 요청의 자동 스케줄링.
  • 여러 동시 네트워크 연결.
  • 표준 HTTP 캐시 일관성을 갖춘 투명 디스크 및 메모리 응답 캐싱 .
  • 요청 우선 순위 지원.
  • 취소 요청 API. 단일 요청을 취소하거나 취소 요청의 블록 또는 범위를 설정할 수 있습니다.
  • 재시도 및 백 오프와 같은 사용자 지정 용이성.
  • 강력한 순서 지정 기능을 사용하면 네트워크에서 비동기 적으로 가져온 데이터로 UI를 쉽게 채울 수 있습니다.
  • 디버깅 및 추적 도구.

========================================



이제 예제를 통해 살펴보겠습니다.



-먼저 manifest에 인터넷권한을 넣어줍니다-

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.a82107.myvolley">
<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" />

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

</manifest>



-build.gradle(Module)에 Volley 라이브러리를 가져다 사용할 수 있게합니다-

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
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'

implementation 'com.android.volley:volley:1.1.0'
}



-이건 메인액티비티에 해도 상관은 없는건데 이번 예제같은 경우는 AppHelper라는 스태틱 클래스를 생성하여 여기에 requestQueue를 넣어줍니다.-

import com.android.volley.RequestQueue;
//pplication 클래스를 정의하고 앱에 등록하여 사용하는 경우에는 이 Application 클래스 안에 넣어둘 수도 있고
// AppHelper와 같은 별도의 클래스를 만들어 그 안에 넣어둘 수도 있습니다. 여기서는 후자방법을 사용했습니다.
public class AppHelper {
//static으로 했으므로 어디서나 참조가능하게해놨음
public static RequestQueue requestQueue;

//먼저 요청(Request) 객체를 만들고 이 요청 객체를 요청 큐(RequestQueue)라는 곳에 넣어주기만 하면 됩니다.
//그러면 요청 큐가 알아서 웹서버에 요청하고 응답까지 받아 사용자가 사용할 수 있도록 지정된 메소드를 호출해줍니다.
}



-메인액티비티의 코드인데 주석에 설명을 달아놨습니다.-

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import java.util.HashMap;
import java.util.Map;
/*웹서버에 요청하고 응답을 받을 때는 HttpURLConnection을 사용할 수 있습니다.

하지만 요청과 응답을 위한 코드의 양이 많은 데다가 스레드를 사용하면서 더 많은 코드를 넣어주게 됩니다.

그렇다면 코드의 양을 좀 더 적게 할 수 있는 방법은 없을까요?

안드로이드에서 제공하는 HTTP 라이브러리를 사용하면 쉽고 빠르게 네트워크 통신을 할 수 있습니다.

여러 라이브러리 중에 많이 사용되는 대표적인 라이브러리인 Volley 라이브러리를 이용해 HTTP로 요청 하고 응답을 받는 방법에 대해 알아봅시다.
* */
//즉 위내용을 요약하면 requestQueue라고 하는거에서(Volley라이브러리) 스레드를 알아서 처리해주기 때문에
// 사용자가 스레드나 핸들러를 직접적으로 처리할 필요가 없어 코드양이 줄어들고 편리하다는 장점이있다.
//gradle에 Volley라이브러리 추가시켜야함
//manifest에서는 인터넷권한 추가
public class MainActivity extends AppCompatActivity {
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

textView = findViewById(R.id.textView);

Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendRequest();
}
});

if(AppHelper.requestQueue == null){
//리퀘스트큐 생성 (MainActivit가 메모리에서 만들어질 때 같이 생성이 될것이다.
AppHelper.requestQueue = Volley.newRequestQueue(getApplicationContext());
}
}

public void sendRequest(){
String url = "https://www.google.co.kr";

//StringRequest를 만듬 (파라미터구분을 쉽게하기위해 엔터를 쳐서 구분하면 좋다)
//StringRequest는 요청객체중 하나이며 가장 많이 쓰인다고한다.
//요청객체는 다음고 같이 보내는방식(GET,POST), URL, 응답성공리스너, 응답실패리스너 이렇게 4개의 파라미터를 전달할 수 있다.(리퀘스트큐에 ㅇㅇ)
//화면에 결과를 표시할때 핸들러를 사용하지 않아도되는 장점이있다.
StringRequest request = new StringRequest(
Request.Method.GET,
url,
new Response.Listener<String>() { //응답을 문자열로 받아서 여기다 넣어달란말임(응답을 성공적으로 받았을 떄 이메소드가 자동으로 호출됨
@Override
public void onResponse(String response) {
println("응답 => " + response);
}
},
new Response.ErrorListener(){ //에러발생시 호출될 리스너 객체
@Override
public void onErrorResponse(VolleyError error) {
println("에러 => "+ error.getMessage());
}
}
){
//만약 POST 방식에서 전달할 요청 파라미터가 있다면 getParams 메소드에서 반환하는 HashMap 객체에 넣어줍니다.
//이렇게 만든 요청 객체는 요청 큐에 넣어주는 것만 해주면 됩니다.
//POST방식으로 안할거면 없어도 되는거같다.
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<String, String>();
return params;
}
};

//아래 add코드처럼 넣어줄때 Volley라고하는게 내부에서 캐싱을 해준다, 즉, 한번 보내고 받은 응답결과가 있으면
//그 다음에 보냈을 떄 이전 게 있으면 그냥 이전거를 보여줄수도 있다.
//따라서 이렇게 하지말고 매번 받은 결과를 그대로 보여주기 위해 다음과같이 setShouldCache를 false로한다.
//결과적으로 이전 결과가 있어도 새로 요청한 응답을 보여줌
request.setShouldCache(false);
AppHelper.requestQueue.add(request);
println("요청 보냄!!");
}

public void println(String data){
textView.append(data + "\n");
}
}



-레이아웃 xml입니다-

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical">


<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="요청" />

<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_blue_bright">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">

<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView"
android:textSize="20dp" />
</LinearLayout>
</ScrollView>


</LinearLayout>



-결과입니다(요청하기 버튼을 클릭하면 해당 웹페이지에 요청을 하면 잠시 후 응답결과들이 스크롤뷰에 나타납니다)



참고 :  https://developer.android.com/training/volley

        https://www.edwith.org/boostcourse-android/lecture/17091/

728x90
Comments