Android Volley

Android Volley 是什么,是一种网络通信的框架,是google 官方维护的网络框架,能很好的支持网络的小信息通信。

github地址
介绍的ppt地址
jar包下载地址
volley-1.0.9.jar
volley-1.0.9-javadoc.jar
volley-1.0.9-sources.jar

我们都需要json,images,raw text Memory 和强有力的缓存机制。 安卓本来就支持http client ,但volley只是做更为普通的工作。

在安卓中,记得一定要添加网络权限

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

##volley支持什么 volley能够传递json数据,图片数据加载。

volley的简单应用: RequestQueue mQueue = Volley.newRequestQueue(context);
RequestQueue 是一个控制http请求的请求队列,需要用mQueue.add(function) 把需要的请求放进队列中,并且mQueue.stop()在Activity结束的时候释终止没有完成的请求。
function 中包括 StringRequest(),JsonArrayRequest(),JsonObjectRequest(),JsonRequest().

对于图片的应用:

ImageListener listener = ImageLoader.getImageListener(imageView, android.R.drawable.ic_menu_rotate, null);
mImageLoader.get(url, listener);//url是图片的地址

使用的函数说明:

    private void add(){
    	RequestQueue mQueue =null;
        mQueue = Volley.newRequestQueue(getApplicationContext());  
        mQueue.add(new StringRequest(Method.GET, "http://www.baidu.com", new Listener<String>() {

			@Override
			public void onResponse(String arg0) {
				// TODO Auto-generated method stub
				System.out.println(arg0.toString());
			}
		},  
                    null));  
        mQueue.start();

上述的代码是get方式,至于post方式则

StringRequest stringRequest = new StringRequest(Method.POST, "http://www.baidu.com",  new Listener<String>() {

			@Override
			public void onResponse(String arg0) {
				// TODO Auto-generated method stub
				System.out.println(arg0.toString());
			}
		}, errorListener) {   
    @Override   
    protected Map<String, String> getParams() throws AuthFailureError {  
        Map<String, String> map = new HashMap<String, String>();  
        map.put("params1", "value1");  
        map.put("params2", "value2");  
        return map;  
    }  
};

图片加载

    ImageRequest imageRequest = new ImageRequest(  
            picture_url,  
            new Response.Listener<Bitmap>() {  
                @Override  
                public void onResponse(Bitmap response) {  
                    imageView.setImageBitmap(response);  
                }  
            }, 0, 0, Config.RGB_565, new Response.ErrorListener() {  
                @Override  
                public void onErrorResponse(VolleyError error) {  
                    imageView.setImageResource(R.drawable.default_image);  
                }  
            });  

ImageRequest image = new ImageRequest(url, listener, maxWidth, maxHeight, decodeConfig, errorListener)
listener 控制的是成功后的操作。

    ImageLoader imageLoader = new ImageLoader(mQueue, new ImageCache() {  
        @Override  
        public void putBitmap(String url, Bitmap bitmap) {  
        }  
      //实现缓存机制
        @Override  
        public Bitmap getBitmap(String url) {  
            return null;  
        }  
    });  

    ImageListener listener = ImageLoader.getImageListener(imageView, R.drawable.default_image, R.drawable.failed_image); 

    imageLoader.get("picture_url",  
                listener, 200, 200); 

//对ImageCache实现缓存机制
    public class BitmapCache implements 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);  
    }  

  ImageLoader imageLoader = new ImageLoader(mQueue, new BitmapCache());//最后的功能实现
} 

NetworkImageView 实现

layout布局上

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
        android:layout_width="fill_parent"  
        android:layout_height="fill_parent"  
        android:orientation="vertical" >  
      
        <Button  
            android:id="@+id/button"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:text="Send Request" />  
          
        <com.android.volley.toolbox.NetworkImageView   
            android:id="@+id/network_image_view"  
            android:layout_width="200dp"  
            android:layout_height="200dp"  
            android:layout_gravity="center_horizontal"  
            />  
      
    </LinearLayout>  

    networkImageView = (NetworkImageView) findViewById(R.id.network_image_view); 
    networkImageView.setDefaultImageResId(R.drawable.default_image);  
    networkImageView.setErrorImageResId(R.drawable.failed_image);  
    networkImageView.setImageUrl("picture_url", imageLoader);

基本上volley就这样,而且我们还可以自订自己的Request

单例模式的volley使用,在volley使用的时候,我们有时候需要注意的是RequestQueue最好是伴随着一个应用的随时使用,这样不会产生多于的操作并且容易掌控,虽然可以继承Application中使用OnCreat方法来调用,但模块化的单例模式能更好的定制。

package com.example.test.net;

import android.content.Context;
import android.graphics.Bitmap;
import android.support.v4.util.LruCache;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.ImageLoader.ImageCache;
import com.android.volley.toolbox.Volley;

public class MySingleton {

    private static MySingleton mInstance;
    private RequestQueue mRequestQueue;
    private static Context mCtx;
    private ImageLoader mImageLoader;
    private MySingleton(Context context){
        mCtx= context;
        mRequestQueue = getRequestQueue();
        mImageLoader = new ImageLoader(mRequestQueue,new ImageCache() {
            private final LruCache<String,Bitmap> 
            cache = new LruCache<String,Bitmap>(20);//缓存设置
            @Override
            public void putBitmap(String arg0, Bitmap arg1) {
                // TODO Auto-generated method stub
                cache.put(arg0, arg1);
            }
            
            @Override
            public Bitmap getBitmap(String arg0) {
                // TODO Auto-generated method stub
                return cache.get(arg0);
            }
        });
    }
    
    public RequestQueue getRequestQueue(){
        if(mRequestQueue==null){
            mRequestQueue = Volley.newRequestQueue(mCtx);
        }
        return mRequestQueue;
    }//获取 RequestQueue 队列
    
    public static synchronized MySingleton getInstance(Context con){
        if(mInstance==null){
            mInstance = new MySingleton(con);
        }
        return mInstance;
    }//单例模式
    public <T> void addToRequestQueue(Request<T> req){
        getRequestQueue().add(req);
    }//把 String 或者 JSON 请求 添加到队列中
    
    public ImageLoader getImageLoader(){
        return mImageLoader;//
    }
    /* 上面的用法
     * ImageListener listener = ImageLoader.getImageListener(imageView, R.drawable.default_image, R.drawable.failed_image); 
        imageLoader.get("picture_url",  listener, 200, 200); 
     */
}