Volley不完全解析

时间:2022-11-10 20:57:54

Volley:适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。解析后直接运行在主线程。
okhttp:能直接得到response对象,能进行大文件的下载。

StringRequest,JsonObjectRequest,ImageRequest的用法
此三种用法类似,,以StringRequest为例一般包括三个步骤:

  1. 创建一个RequestQueue对象。
  2. 创建一个StringRequest对象。
  3. 将StringRequest对象添加到RequestQueue里面。
public void button1(View view) {
        RequestQueue queue = Volley.newRequestQueue(this);
        //POST请求
// StringRequest stringRequest = new StringRequest(Request.Method.POST, url, listener, errorListener);
        //参数 GET请求 url,success callback , failure callback

        StringRequest request = new StringRequest("http://www.baidu.com", new Response.Listener<String>() {
            @Override
            public void onResponse(String s) {
                Log.d("TAG", s);

            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                //参数 String tag ,String message,throwable
                Log.e("TAG", volleyError.getMessage(), volleyError);

            }
        });
        queue.add(request);
    }

ImageLoader用法:
1. 创建一个RequestQueue对象。
2. 创建一个ImageLoader对象。
3. 获取一个ImageListener对象。
4. 调用ImageLoader的get()方法加载网络上的图片。

public void button4(View view) {
/*        RequestQueue queue = Volley.newRequestQueue(this);
// ImageLoader imageLoader = new ImageLoader(queue, new ImageLoader.ImageCache() {
// @Override
// public void putBitmap(String url, Bitmap bitmap) {
// }
//
// @Override
// public Bitmap getBitmap(String url) {
// return null;
// }
// });
        ImageLoader imageLoader = new ImageLoader(queue, new BitmapCache());
        //加载过程中的图片 失败后显示的图片
        ImageLoader.ImageListener listener = ImageLoader.getImageListener(imageView,
                R.mipmap.ic_launcher, R.mipmap.ic_launcher);
        imageLoader.get("http://img.my.csdn.net/uploads/201407/17/1405567749_8669.jpg", listener);*/
        VolleyUtil.image_load("news_1.jpg",imageView);   //封装后仅仅一行代码
    }

new ImageLoader.ImageCache(){}为空,则不会压缩图片。
编写的应用程序都是有一定内存限制的,程序占用了过高的内存就容易出现OOM(OutOfMemory)异常。BitmapCache类能高效加载大图。

import android.graphics.Bitmap;
import android.util.LruCache;

import com.android.volley.toolbox.ImageLoader;


/** * Created by Administrator on 2016/11/7. */

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);
    }
}

NetworkImageView控件加载图片
1. 创建一个RequestQueue对象。
2. 创建一个ImageLoader对象。
3. 在布局文件中添加一个NetworkImageView控件。
4. 在代码中获取该控件的实例。
5. 设置要加载的图片地址。

    //NetworkImageView并不需要提供任何设置最大宽高的方法也能够对加载的图片进行压缩
    public void button5(View view) {
        RequestQueue queue = Volley.newRequestQueue(this);
        ImageLoader imageLoader = new ImageLoader(queue, new BitmapCache());
        e_imageView.setDefaultImageResId(R.mipmap.ic_launcher);
        e_imageView.setErrorImageResId(R.mipmap.ic_launcher);
        e_imageView.setImageUrl("http://img.my.csdn.net/uploads/201404/13/1397393290_5765.jpeg",
                imageLoader);
    }

将Volley工具封装:

import android.content.Context;
import android.graphics.Bitmap;
import android.util.Log;
import android.widget.ImageView;
import android.widget.Toast;

import com.android.volley.AuthFailureError;
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.ImageLoader;
import com.android.volley.toolbox.ImageRequest;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import java.util.Map;

/** * Created by Administrator on 2016/11/8. */

public class VolleyUtil {
    private static RequestQueue queue;
    private static Context context;
    private static String path = "http://169.254.63.97:8080/BookBox/servlet/";
    private static String iamge_path = "http://169.254.63.97:8080/BookBox/drawable/";
    public  static RequestQueue getRequestQueue(Context context){
        VolleyUtil.context=context;
        if (queue == null){
            queue = Volley.newRequestQueue(context);
        }
        return queue;
    }

    public static void DoGet(String classname, Map<String,String> omap){

        StringBuilder builder = new StringBuilder(path);
        builder.append(classname).append("?");
        for (Map.Entry<String,String> str:omap.entrySet()){
            String key = str.getKey();
            String value = str.getValue();
            builder.append(key).append("=").append(value).append("&");
        }
        builder.deleteCharAt(builder.length()-1);
        StringRequest request = new StringRequest(builder.toString(), new Response.Listener<String>() {
            @Override
            public void onResponse(String s) {
                resultInfo.result(s);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                Log.e("TAG", volleyError.getMessage(), volleyError);
                Toast.makeText(context, "加载失败", Toast.LENGTH_SHORT).show();

            }
        });
        queue.add(request);
    }
    public interface ResultInfo{
        public void result(String info);
        public void result_bitmap(Bitmap bitmap);

    }
    public static ResultInfo resultInfo;
    public static  void setResultInfo(ResultInfo resultInfo){
        VolleyUtil.resultInfo= resultInfo;

    }
    public static void DoPost(String classname, final Map<String,String> oMap){
        StringBuilder builder = new StringBuilder(path);
        builder.append(classname);
        StringRequest request = new StringRequest(Request.Method.POST, builder.toString(),
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String s) {
                        VolleyUtil.resultInfo.result(s);

                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                Toast.makeText(context, "下载失败", Toast.LENGTH_SHORT).show();

            }
        }){
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                return oMap;
            }
        };
        queue.add(request);
    }
    public static void image_Requst(String image_name){
        StringBuilder builder = new StringBuilder(iamge_path);
        builder.append(image_name);
        ImageRequest request = new ImageRequest(builder.toString(), new Response.Listener<Bitmap>() {
            @Override
            public void onResponse(Bitmap bitmap) {
                VolleyUtil.resultInfo.result_bitmap(bitmap);

            }
        }, 0, 0, Bitmap.Config.RGB_565, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                Toast.makeText(context, "获取图片失败", Toast.LENGTH_SHORT).show();
            }
        });
        queue.add(request);

    }
    public static void image_load(String image_name,ImageView imageView){
        ImageLoader loader = new ImageLoader(queue,new BitmapCache());
        ImageLoader.ImageListener listener = ImageLoader.getImageListener(imageView,
                R.mipmap.ic_launcher,R.mipmap.ic_launcher);
        loader.get(new StringBuilder(iamge_path).append(image_name).toString(),listener);

    }

}

其中path,image_path地址自行修改。

参考:http://blog.csdn.net/sinyu890807/article/details/17482095