`
砺雪凝霜
  • 浏览: 156714 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android网络请求框架Volley(一)

阅读更多

1 Volley的介绍

    Volley从服务器端请求字符串数据图片数据,和JSON格式数据。Volley可以写出标准化的模板代码,并让我们更加关注于我们的业务逻辑,这对于我们的App来说是非常重要的。

 

Volley的优势:

 

  •  自动的调度网络请求
  •  多并发的网络请求
  •   可以缓存http请求
  •  支持请求的优先级
  •  支持取消请求的API,可以取消单个请求,可以设置取消请求的范围域。
  •  代码标准化,使开发者更容易专注于我们的业务的逻辑处理
  •  更容易给UI填充来自网络请求的数据
  •  Volley可以是作为调试和跟踪的工具

    Volley非常不适合大的文件流操作,例如上传和下载。因为Volley会把所有的服务器端返回的数据在解析期间缓存进内存。大量的下载操作可以考虑用DownLoaderManager和异步加载来实现。

Volley库的地址如下:

git clone https://android.googlesource.com/platform/frameworks/volley

 

2 Volley的工作原理

      为了发送一个请求,你可以通过构造方法new出来一个Request,然后调用add()把请求添加进RequestQueue中,当调用add方法时,Volley会运行一个缓存处理线程和一个网络调度线程池.如果请求被缓存线程已经缓存的话,请求将不会放进请求队列,也就是说不会发出Http请求。而会直接复用请求,并将数据返回到主线程。如果缓存线程中没有缓存到请求的话,请求将会放进请求队列,网络请求成功后, 请求将会被缓存进cache,接着网络调度线程将处理该请求,并解析数据。
Volley的工作原理图如下:

3 使用volley请求数据

    3.1 利用StringRequest请求字符串数据

    Volley提供了一个便利的方法Volley.newRequestQueue可以使用默认的设置创建一个RequestQueue,例如:

 

finalTextView mTextView =(TextView) findViewById(R.id.text);
...
 
// Instantiate the RequestQueue.
RequestQueue queue =Volley.newRequestQueue(this);
String url ="http://www.google.com";
 
// Request a string response from the provided URL.
StringRequest stringRequest =newStringRequest(Request.Method.GET, url,
newResponse.Listener<String>(){
@Override
publicvoid onResponse(String response){
// Display the first 500 characters of the response string.
mTextView.setText("Response is: "+ response.substring(0,500));
}
},newResponse.ErrorListener(){
@Override
publicvoid onErrorResponse(VolleyError error){
mTextView.setText("That didn't work!");
}
});
// Add the request to the RequestQueue.
queue.add(stringRequest);
 

3.2 利用ImageRequest请求图片

publicclassMainActivityextendsActivity{
privateImageView mImageView;
@Override
protectedvoid onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mImageView =(ImageView) findViewById(R.id.iv_image);
 
}
 
publicvoid requestImage(){
// Retrieves an image specified by the URL, displays it in the UI.
   String url ="http://i.imgur.com/7spzG.png";
   ImageRequest request =newImageRequest(url,
   newResponse.Listener<Bitmap>(){
@Override
publicvoid onResponse(Bitmap bitmap){
   Toast.makeText(MainActivity.this,"success",1).show();
   mImageView.setImageBitmap(bitmap);
}
},0,0,null,newResponse.ErrorListener(){
publicvoid onErrorResponse(VolleyError error){
/*mImageView
.setImageResource(R.drawable.image_load_error);*/
}
});
    Volley.newRequestQueue(getApplicationContext()).add(request);
}
 
}
    

3.3 使用NetworkImageView结合imageLoader加载网络图片

<com.android.volley.toolbox.NetworkImageView
android:id="@+id/networkImageView"
android:layout_width="150dp"
android:layout_height="170dp"
android:layout_centerHorizontal="true"/>
ImageLoader mImageLoader;
ImageView mImageView;
// The URL for the image that is being loaded.
private static final String IMAGE_URL =
    "http://developer.android.com/images/training/system-ui.png";
...
mImageView = (ImageView) findViewById(R.id.regularImageView);
 
// Get the ImageLoader through your singleton class.
  mImageLoader = MySingleton.getInstance(this).getImageLoader();
  mImageLoader.get(IMAGE_URL, ImageLoader.getImageListener(mImageView,R.drawable.def_image, R.drawable.err_image));
 
TextView mTxtDisplay;
ImageView mImageView;
mTxtDisplay = (TextView) findViewById(R.id.txtDisplay);
String url = "http://my-json-feed";
 
JsonObjectRequest jsObjRequest = new JsonObjectRequest
        (Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
 
    @Override
    public void onResponse(JSONObject response) {
        mTxtDisplay.setText("Response: " + response.toString());
    }
}, new Response.ErrorListener() {
 
    @Override
    public void onErrorResponse(VolleyError error) {
        // TODO Auto-generated method stub
 
    }
});
 
// Access the RequestQueue through your singleton class.
MySingleton.getInstance(this).addToRequestQueue(jsObjRequest);
 

 3.4 使用JsonObjectRequest请求json格式数据(个人感觉和StringRequest一样)

TextView mTxtDisplay;
ImageView mImageView;
mTxtDisplay = (TextView) findViewById(R.id.txtDisplay);
String url = "http://my-json-feed";
 
JsonObjectRequest jsObjRequest = new JsonObjectRequest
        (Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
 
    @Override
    public void onResponse(JSONObject response) {
        mTxtDisplay.setText("Response: " + response.toString());
    }
}, new Response.ErrorListener() {
 
    @Override
    public void onErrorResponse(VolleyError error) {
        // TODO Auto-generated method stub
 
    }
});
 
// Access the RequestQueue through your singleton class.
MySingleton.getInstance(this).addToRequestQueue(jsObjRequest);

4 如何取消请求

   Volley通过调用cancel()方法取消一个请求,并保证请求不会在Response中回调处理,你可以在activity中的onStop中取消所有你想取消的请求,最简单的方法就是给所有想取消的请求调用setTag(TAG)设置标记,然后放进请求队列,在Activity的onStop方法中调用cancelAll(TAG)方法取消请求。

 

代码如下:

   给请求设置TAG,并放进请求队列

 

public static final String TAG = "MyTag";
StringRequest stringRequest; // Assume this exists.
RequestQueue mRequestQueue;  // Assume this exists.
// 给请求设置tag
stringRequest.setTag(TAG);
// 把请求放进请求队列
mRequestQueue.add(stringRequest);

   在onstop方法中取消所有设置Tag的请求

 

 

@Override
protected void onStop () {
    super.onStop();
    if (mRequestQueue != null) {
        mRequestQueue.cancelAll(TAG);
    }
}

 

 


注意:当取消请求的时候,onResponse和onErrorResponse方法将不会执行

 

5 如何新建一个RequestQueue

 5.1 RequestQueue的配置

      Volley.newRequestQueue ​可以创建一个请求队列,但那只能使用Volley
的默认配置,下面来讲讲如何来创建自己的一个请求队列。每次去new一个请求队列是非常消耗内存的,我们可以利用单列模式来避免每次都去new一个请求队列。
 
RequestQueue mRequestQueue;
 
// 配置缓存大小
Cache cache = new DiskBasedCache(getCacheDir(), 1024 * 1024); // 1MB cap
 
// 设置网络请求方式(UrlConnection和HttpClient)
Network network = new BasicNetwork(new HurlStack());
 
//初始化RequestQueue
mRequestQueue = new RequestQueue(cache, network);
 
// 开启RequestQueue
mRequestQueue.start();
 
String url ="http://www.myurl.com";
 
// Formulate the request and handle the response.
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
        new Response.Listener<String>() {
    @Override
    public void onResponse(String response) {
        // Do something with the response
    }
},
    new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            // Handle error
    }
});
 
// 把请求添加进请求队列
mRequestQueue.add(stringRequest);
 5.2 RequestQueue中BasicNewWork(网络)的内部机制
     查看volley源码可以知道:Volley一般联网的方式有HttpClient和HttpURLConnection,
如果API低于9的话可以调用HttpRULConnection请求网络,如果API高于9的话,会用HttpClient
请求网络,源码如下:

 

HttpStack stack;
...
// If the device is running a version >= Gingerbread...
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
    // ...use HttpURLConnection for stack.
} else {
    // ...use AndroidHttpClient for stack.
}
Network network = new BasicNetwork(stack);  

 

 5.3  使用requestQueue的注意事项

 

  • 如果你的项目要进行频繁的网路请求,你可以在application的onCreate方法中创建一个RequestQueue,google官方文档强烈建议我们把RequestQueue设计成单列模式。
  • 但是要注意,在RequestQueue中的Context对象为applicationContext,而不是Activity对应的context对象,可以避免在activity中每次都去消费使用activity中的context对象。
下面是使用单列设计模式创建的一个请求队列

 

private static MySingleton mInstance;
    private RequestQueue mRequestQueue;
    private static Context mCtx;
 
    public static synchronized MySingleton getInstance(Context context) {
        if (mInstance == null) {
            mInstance = new MySingleton(context);
        }
        return mInstance;
    }
 
    public RequestQueue getRequestQueue() {
        if (mRequestQueue == null) {
            // getApplicationContext() is key, it keeps you from leaking the
            // Activity or BroadcastReceiver if someone passes one in.
            mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext());
        }
        return mRequestQueue;
    }
 
    public <T> void addToRequestQueue(Request<T> req) {
        getRequestQueue().add(req);
    }
 
    public ImageLoader getImageLoader() {
        return mImageLoader;
    }
}
 

 

 

 

  • 大小: 123.5 KB
分享到:
评论

相关推荐

    网络请求框架volley-master

    网络请求框架volley-master网络请求框架volley-master

    Android网络请求框架之volley框架

    Volley是Google官方推出的一款高效的Android网络请求框架,专为Android平台设计,旨在提供轻量级、快速且易于使用的网络通信库。它以其强大的缓存机制、线程管理以及对异步请求的良好支持而受到开发者欢迎。Volley的...

    Android网络通信框架Volley

    **Android网络通信框架Volley详解** Volley是Google在2013年I/O大会上推出的一款专门为Android平台设计的网络通信框架,它以其高效的性能、简单的API和良好的可扩展性,成为了众多Android开发者进行网络请求时的...

    安卓网络请求框架volley的封装 轻松实现网络请求

    【Android网络请求框架Volley详解】 在Android应用开发中,网络请求是不可或缺的一部分,Volley是Google推出的一个高效的网络请求库,它优化了网络通信,提供了便捷的API接口,使得开发者能够快速、轻松地实现网络...

    Android-VolleyManager是对android网络请求框架volley的封装

    在Android应用开发中,网络请求是必不可少的一部分,用于获取服务器数据、更新用户界面等操作。Volley是由Google推出的一款高效、易用的网络请求库,它优化了HTTP请求的处理,提高了性能,特别适合实时性要求较高的...

    Android网络请求框架

    本篇文章将详细介绍几个常用的Android网络请求框架:OkHttp、Volley、HttpClient以及XUtils。 一、OkHttp OkHttp是由Square公司开发的一款高效的网络请求库,它具有以下特点: 1. **连接池**:OkHttp维护了一个...

    Android网络框架-Volley(一) 初步使用Volley

    Volley是Google为Android开发的一款高效的网络通信库,它的设计目标是简化网络请求,并优化了内存管理和线程处理,使得在网络交互中能提供快速、流畅的用户体验。在本篇文章中,我们将深入探讨Volley的基本使用,...

    Android 网络通信框架Volley

    **Android网络通信框架Volley详解** Volley是Google在2013年I/O大会上推出的一个高效的网络通信库,主要用于Android应用中的网络请求。Volley的设计目标是提供一个轻量级、高性能的库,使开发者能够更方便地处理...

    android中网络请求库volley.jar和asnychttp.jar

    在Android应用开发中,网络请求是必不可少的一部分,用于获取服务器上的数据或发送用户的数据到服务器。本篇文章将详细探讨两个常用的网络请求库:Volley和AsyncHttp,它们都是Android开发者们常常选择的工具。 ...

    android网络通信框架 Volley的小Demo

    上传的是一个eclipse下的android工程,主要展示的是对android 的网络通信框架 Volley的简单使用,展示了一些api的使用,有get和post方法的请求方式以及网络图片的缓存等等,我正是使用了这个demo 完成了我的一个在线...

    Android网络通信框架Volley的解析和比较.pdf

    Volley 是 Google 在 2013 年的 Google I/O 大会上推出的一款针对 Android 平台的网络通信框架,它特别适用于数据量较小但通信频率较高的场景。Volley 的设计目标是提供高效、易用的网络通信解决方案,减少开发者的...

    Google I/O 2013推荐Android 网络通信框架Volley

    Volley是Google在2013年的I/O大会上推出的一款高效的Android网络通信框架,它专为Android应用设计,旨在简化网络请求的处理,提高应用程序的响应速度和用户体验。这款框架的核心理念是快速、高效和易用,使得开发者...

    网络请求框架Volley

    Volley是Google在2013年I/O大会上推出的一款强大的网络请求库,专为Android应用设计,旨在简化网络通信并优化性能。它的主要特点包括高效的数据缓存、线程管理以及对异步请求的优秀支持,使得开发者可以快速、方便地...

    android网络请求框架 HttpClient与Volley的性能对比

    本文将对HttpClient和Volley这两款网络请求框架进行详细的性能对比。 HttpClient,全称为Apache HttpClient,是一个基于HTTP协议的客户端编程工具包。它提供了丰富的API,可以处理各种HTTP请求,如GET、POST等。...

    android最新网络框架Volley使用实例

    Volley是Google为Android开发的一款高效的网络通信框架,它的设计目标是简化网络请求,并优化Android设备上的图片加载。Volley以其高效、灵活和易于使用的特性,成为许多Android开发者首选的网络库。 首先,我们来...

Global site tag (gtag.js) - Google Analytics