Android 에서 Volley 프레임 워 크 는 네트워크 데이터 사용 을 요청 합 니 다.

문제 에 대한 설명:안 드 로 이 드 SDK 의 HttpClient 와 HttpUrlConnection 두 가지 요청 방식 은 네트워크 의 복잡 한 작업 을 처리 하 는 데 사 용 됩 니 다.그러나 응용 이 복잡 할 때 많은 코드 를 작성 하여 많은 것 을 처리 해 야 합 니 다.이미지 캐 시,요청 한 스케줄 링 등 입 니 다.
해결:Volley 는 이러한 것들 을 해결 하기 위해 태 어 났 습 니 다.2013 년 구 글 I/O 대회 에서 제 기 된 것 과 같 습 니 다.안 드 로 이 드 응용 네트워크 작업 을 더욱 편리 하고 빠르게 할 수 있 습 니 다.바 텀 Http Client 등 이 실현 하 는 디 테 일 을 추상 화하 여 개발 자 들 이 RESTful Request 에 더욱 집중 하고 생 성 하도록 합 니 다.또한 볼 리 는 서로 다른 스 레 드 에서 모든 요 구 를 비동기 로 실행 하여 메 인 스 레 드 를 막 지 않도록 했다.
Volley 는 AsyncHttpClient 와 Universal-Image-Loader 의 장점 을 한데 모 았 다 고 할 수 있다.AsyncHttpClient 처럼 간단하게 HTTP 통신 을 할 수도 있 고,Universal-Image-Loader 처럼 네트워크 에 있 는 그림 을 쉽게 불 러 올 수도 있다.간단 하고 사용 하기 쉬 운 것 을 제외 하고 Volley 는 성능 도 대폭 조정 했다.그의 디자인 목 표 는 데이터 양 이 많 지 않 지만 통신 이 빈번 한 네트워크 조작 에 매우 적합 하 다 는 것 이다.반면에 빅 데이터 양의 네트워크 조작,예 를 들 어 파일 을 다운로드 하 는 등 Volley 의 표 는 매우 나 빠 질 것 이다.
这里写图片描述
1.볼 리 는 도대체 어떤 특징 이 있 나 요?
자동 스케줄 링 네트워크 요청
여러 개의 병렬 네트워크 연결
표준 HTTP 캐 시 메커니즘 을 사용 하여 디스크 와 메모리 응답 을 일치 시 킵 니 다.
지원 요청 우선 순위
요청 을 취소 하 는 강력 한 API 를 지원 합 니 다.단일 요청 이나 여러 개 를 취소 할 수 있 습 니 다.
맞 춤 형 제작 이 용이 하 다.
건장 성:UI 를 정확하게 업데이트 하고 데 이 터 를 얻 을 수 있 습 니 다.
디 버 깅 및 추적 도구 포함
2.Volley 의 RequestQueue 와 Request
●RequestQueue 요청 을 수행 하기 위 한 요청 대기 열
●Request 는 요청 대상 을 만 드 는 데 사용 된다.
●Request 대상 은 주로 다음 과 같은 몇 가지 유형 이 있 습 니 다.
a.StringRequest 응답 주 체 는 문자열 입 니 다.
b.JSONArray Request 에서 JSON 배열 을 보 내 고 받 습 니 다.
c.JSON Object Request 에서 JSON 대상 을 보 내 고 받 습 니 다.
d.ImageRequest 에서 Image 를 보 내 고 받 습 니 다.
3.Volley 의 사용 절차:
(1)안 드 로 이 드 프로젝트 를 만 들 고 볼 리 의 jar 패 키 지 를 가 져 옵 니 다.
这里写图片描述
(2)GET 의 요청 방식:

//  RequestQueue  
RequestQueue requestQueue = Volley.newRequestQueue(this);
String url="http://api.m.panda.tv/ajax_get_all_subcate?__version=1.0.1.1300&__plat=android";
//  request  
StringRequest request=new StringRequest(url, new Response.Listener<String>() {
/**
*        
* @param response                
*/
@Override
public void onResponse(String response) {
// 
}
}, new Response.ErrorListener() {
/**
*             ,     
* 07-19 04:17:13.414: E/tag(1181): -------------
* com.android.volley.VolleyError: 
* java.lang.SecurityException: 
* Permission denied (missing INTERNET permission?)==========================
*/
@Override
public void onErrorResponse(VolleyError error) {
Log.e("tag","-------------"+ error+"==========================");
}
});
// Request     RequestQueue  。
requestQueue.add(request);
(3)Post 요청 방식:
요청 방법 을 지정 하여 Request.Method.POST 로 post 요청 을 한 다음 getParams 방법 으로 요청 인 자 를 설정 합 니 다.POST 요청 을 보 낼 때 볼 리 는 StringRequest 의 부모 클래스 인 Request 의 getParams()방법 으로 POST 인 자 를 가 져 오 려 고 시도 합 니 다.

//  RequestQueue   
RequestQueue requestQueue = Volley.newRequestQueue(this); 
String url=”http://api.m.panda.tv/ajax_get_all_subcate”; 
StringRequest request=new StringRequest(Request.Method.POST, url, new Response.Listener() {
@Override
public void onResponse(String response) {
Log.e("tag", "    ============"+response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("tag", "    ============"+error);
}
}){
/**
*   getParams      ,post       
*/
@Override
protected Map<String, String> getParams() throws AuthFailureError {
HashMap<String, String> params = new HashMap<String,String>();
params.put("__version", "1.0.1.1300");
params.put("__plat", "android");
return params;
}
};
requestQueue.add(request);
(3)그림 을 불 러 오 는 방법:
첫 번 째 그림 불 러 오 는 방법

RequestQueue requestQueue = Volley.newRequestQueue(context);
String img = datas.getImg();
//                         ,                       ,         ,   0            ,       。
//                
ImageRequest request=new ImageRequest(img, new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
holder.iv.setImageBitmap(response);
}
}, 0, 0,Bitmap.Config.ARGB_8888, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// TODO Auto-generated method stub
}
});
requestQueue.add(request);
두 번 째 그림 불 러 오 는 방법
사실 그림 을 불 러 오 는 기능 은 이 뿐만 이 아 닙 니 다.ImageLoader 를 사용 하면 그림 에 대한 캐 시 를 실현 할 수 있 고 중복 링크 를 걸 러 중복 요청 을 피 할 수 있 습 니 다.
ImageLoader 의 사용 방법 은 다음 과 같은 몇 가지 로 요약 된다.
1.RequestQueue 대상 을 만 듭 니 다.
2.ImageLoader 대상 을 만 듭 니 다.
3.ImageListener 대상 가 져 오기.
4.ImageLoader 의 get()방법 으로 네트워크 에 있 는 그림 을 불 러 옵 니 다.

//  ImageCache,  LruCache    
public class BitmapCache implements ImageLoader.ImageCache {
private LruCache<String, Bitmap> mCache;
public BitmapCache() {
int maxSize = 10 * 1024 * 1024;
mCache = new LruCache<String, Bitmap>(maxSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
return bitmap.getRowBytes() * bitmap.getHeight();
}
};
}
@Override
public Bitmap getBitmap(String url) {
return mCache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
mCache.put(url, bitmap);
}
}
private void getImageByImageLoader() {
ImageView iv= (ImageView) findViewById(R.id.iv);
RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
String url = "https://www.baidu.com/img/bdlogo.png";
ImageLoader loader=new ImageLoader(queue,new BitmapCache() );
//               ImageView  
//                     
//                       
ImageLoader.ImageListener listener=ImageLoader.getImageListener(iv,R.mipmap.ic_launcher,R.mipmap.ic_launcher);
//   ImageLoader get()       
//           URL  
//              ImageListener  
//              ,     get()     ,              ,            
loader.get(url,listener);
}
세 번 째 그림 불 러 오 는 방법
마지막 으로 볼 리 는 그림 을 불 러 오 는 사용자 정의 ImageView 를 제공 합 니 다.사용 방법 은 다음 과 같 습 니 다.
1.RequestQueue 대상 을 만 듭 니 다.
2.ImageLoader 대상 을 만 듭 니 다.
3.레이아웃 파일 에 NetworkImageView 컨트롤 을 추가 합 니 다.
4.코드 에서 이 컨트롤 의 인 스 턴 스 를 가 져 옵 니 다.
5.불 러 올 그림 주 소 를 설정 합 니 다.
단계 1:레이아웃 에서 이 컨트롤 을 설명 합 니 다.

<com.android.volley.toolbox.NetworkImageView
android:id="@+id/network_image_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
/>
단계 2:프로그램 에서 불 러 오기

public void networkImageView(){
RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
ImageLoader loader=new ImageLoader(queue,new BitmapCache() );
NetworkImageView niv= (NetworkImageView) findViewById(R.id.network_image_view);
niv.setDefaultImageResId(R.mipmap.ic_launcher);//          
niv.setErrorImageResId(R.mipmap.ic_launcher);//            
niv.setImageUrl("https://www.baidu.com/img/bdlogo.png", loader);//       URL  
}
4.사용자 정의 요청
실제 응용 프로그램 에 서 는 http 요청 을 json 과 통합 시 켜 야 하 는데,Volley 는 이러한 방식 을 지원 하고 있 습 니 다.그러나 우리 스스로 Request 를 사용자 정의 해 야 합 니 다.여 기 는 google 의 Gson 라 이브 러 리 를 사용 하여 통합 합 니 다.
1.계승 요청 클래스
2.parseNetworkResponse 를 다시 쓰 고 json 과 실체 류 의 전환 을 실현 합 니 다.실체 류 가 정 해 지지 않 았 기 때문에 범 형 을 사용 합 니 다.
다음 에 사용 할 json 문자열 은 다음 과 같 습 니 다.

{“name”:”lizhangqu”,”age”:16}
단계 1:

package cn.edu.zafu.http;
import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.toolbox.HttpHeaderParser;
import com.google.gson.Gson;
import java.io.UnsupportedEncodingException;
/**
* Created by lizhangqu on 2015/5/7.
*/
public class GsonRequest<T> extends Request<T> {
private final Response.Listener<T> mListener;
private Gson mGson;
private Class<T> mClass;
public GsonRequest(int method, String url, Class<T> clazz, Response.Listener<T> listener,
Response.ErrorListener errorListener) {
super(method, url, errorListener);
mGson = new Gson();
mClass = clazz;
mListener = listener;
}
public GsonRequest(String url, Class<T> clazz, Response.Listener<T> listener,
Response.ErrorListener errorListener) {
this(Method.GET, url, clazz, listener, errorListener);
}
@Override
protected Response<T> parseNetworkResponse(NetworkResponse response) {
try {
String jsonString = new String(response.data,
HttpHeaderParser.parseCharset(response.headers));
return Response.success(mGson.fromJson(jsonString, mClass),
HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
}
}
@Override
protected void deliverResponse(T response) {
mListener.onResponse(response);
}
}
단계 2:테스트 실체 클래스 를 작성 하고,두 필드 에 name,age 를 작성 합 니 다.

package cn.edu.zafu.http;
/**
* Created by lizhangqu on 2015/5/7.
*/
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
STEP 3:호출 방법 은 StringRequest 와 같 습 니 다.아래 와 같다

private void json(){
RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
String url = "http://121.41.119.107/test/index.php";
GsonRequest<Person> request=new GsonRequest<Person>(url, Person.class, new Response.Listener<Person>() {
@Override
public void onResponse(Person response) {
Log.d("TAG",response.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
queue.add(request);
}
위 에서 말씀 드 린 것 은 편집장 님 께 서 소개 해 주신 안 드 로 이 드 의 볼 리 프레임 워 크 에서 인터넷 데이터 의 사용 을 요청 하 는 것 입 니 다.여러분 께 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 님 께 서 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기