笔记

来源:互联网 发布:万网域名后台登陆 编辑:程序博客网 时间:2024/06/07 22:38

Volley框架:

volley的特性:volley适合快速,简单的请求(Json对象,图片加载)

1.JSON,图像等的异步下载;

2.网络请求的排序(scheduling

3.网络请求的优先级处理

4.缓存

5.多级别取消请求

6.Activity和生命周期的联动(Activity结束时同时取消所有网络请求)

 

 

1.StringRequest

   加载网络数据的步骤

 

   --首先创建请求队列(RequestQueue)RequestQueue只需要一个实例即可,不像AsyncTask每次使用都要new一个)

// 初始化RequestQueue一个activity只需要一个

RequestQueue mQueue=null;

    private void initRequestQueue() {  

        mQueue = Volley.newRequestQueue(getApplicationContext());  

    }  

----------------------------------------------

   --创建请求对象(StringRequest)

StringRequest request=null;

String cityname;

try {

cityname = URLEncoder.encode("北京", "utf8");

String path="http://op.juhe.cn/onebox/weather/query?cityname="+cityname

+"&dtype=&key=你的key";

//创建一个请求对象

request=new StringRequest(path, new Listener<String>() {

@Override

public void onResponse(String response) {

Gson gson=new Gson();

WeatherEntity entity=gson.fromJson(response, WeatherEntity.class);

Log.i("Tag", entity.toString());

}

},  new ErrorListener() {

@Override

public void onErrorResponse(VolleyError error) {

Log.i("Tag", error.getMessage());

 

}

});

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

------------------------------------------------------

   --把网络请求的对象加求请求队列发出请求

queue.add(request);

---------------------------------------------------

      --成功响应获得String  

public void onResponse(String response) {

Gson gson=new Gson();

WeatherEntity entity=gson.fromJson(response, WeatherEntity.class);

Log.i("Tag", entity.toString());

}

      --失败获得VolleyError

public void onErrorResponse(VolleyError error) {

Log.i("Tag", error.getMessage());

 

}

如果需要:

// 重写parseNetworkResponse方法改变返回头参数解决乱码问题  

        // 主要是看服务器编码,如果服务器编码不是UTF-8的话那么就需要自己转换,反之则不需要  

 

StringRequest srReq = new StringRequest(Request.Method.GET, url,  

            new StrListener(), new StrErrListener()) {  

  

        protected final String TYPE_UTF8_CHARSET = "charset=UTF-8";  

  

        // 重写parseNetworkResponse方法改变返回头参数解决乱码问题  

        // 主要是看服务器编码,如果服务器编码不是UTF-8的话那么就需要自己转换,反之则不需要  

        @Override  

        protected Response<String> parseNetworkResponse(  

                NetworkResponse response) {  

            try {  

                String type = response.headers.get(HTTP.CONTENT_TYPE);  

                if (type == null) {  

                    type = TYPE_UTF8_CHARSET;  

                    response.headers.put(HTTP.CONTENT_TYPE, type);  

                } else if (!type.contains("UTF-8")) {  

                    type += ";" + TYPE_UTF8_CHARSET;  

                    response.headers.put(HTTP.CONTENT_TYPE, type);  

                }  

            } catch (Exception e) {  

            }  

            return super.parseNetworkResponse(response);  

        }  

    };  

    request.setShouldCache(true);//控制是否缓存

-----------------------------------------------------

2.Volley图片的处理方式

 

 

   --ImageRequest

=======

  @param url

  *            图片地址

  * @param listener

  * @param maxWidth

*            指定允许图片最大的宽度

  * @param maxHeight

*            指定允许图片最大的高度

* @param decodeConfig

*            指定图片的颜色属性,Bitmap.Config下的几个常量.

* @param errorListener

      --少量图片加载不需缓存处理会对获得的图片进行压缩处理

 

 

RequestQueue queue=Volley.newRequestQueue(this);

---------------------------------------------------

String url="http://172.60.25.9:8080/MusicServer/images/pingfanzhilu.jpg";

ImageRequest request=new ImageRequest(url, new Listener<Bitmap>() {

@Override

public void onResponse(Bitmap response) {

iamge.setImageBitmap(response);

}

}, 0, 0, Config.ARGB_8888,new ErrorListener() {

 

 

@Override

public void onErrorResponse(VolleyError error) {

Log.i("Tag", error.getMessage());

}

});

--------------------

queue.add(request);

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

   --ImageLoader

      --具有本地缓存功能的图片加载器,缓存空间需要自定义

课堂案例:

--------------

public class ImageLoaderActivity extends Activity {

ImageView imageView_loader=null;

RequestQueue queue=null;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_image_loader);

imageView_loader=(ImageView) findViewById(R.id.imageView_loader);

queue=Volley.newRequestQueue(this);

}

public void imageloader(View view){

ImageLoader loader=new ImageLoader(queue, new ImageCache() {

 

int maxSize=1024*1024*4;

LruCache<String, Bitmap> cache=new LruCache<String, Bitmap>(maxSize){

protected int sizeOf(String key, Bitmap value) {

return value.getRowBytes()*value.getHeight();

};

};

@Override

public void putBitmap(String url, Bitmap bitmap) {

//把加载成功的图片存入缓存

cache.put(url, bitmap);

}

 

@Override

public Bitmap getBitmap(String url) {

//从缓存中获得图片

return cache.get(url);

}

});

String url="http://172.60.50.50:8080/MusicServer/images/disanji.jpg";

 

ImageListener listener=ImageLoader.getImageListener(

imageView_loader,

R.drawable.ic_launcher,

R.drawable.ic_launcher);

 

loader.get(url, listener);

}

 

 

}

=========

=========

应用实例

----------------------------------------------

public class ImageAdapter extends ArrayAdapter<String> {  

      

    private RequestQueue mQueue;  

    private ImageLoader mImageLoader;  

  

    public ImageAdapter(Context context, List<String> objects) {  

        super(context, 0, objects);  

        mQueue = Volley.newRequestQueue(getContext());  

        mImageLoader = new ImageLoader(mQueue, new BitmapCache());  

    }  

      

   @Override  

    public View getView(int position, View convertView, ViewGroup parent) {  

        String url = getItem(position);  

         ImageView imageView;  

        if (convertView == null) {  

            imageView = new ImageView(getContext());  

        } else {  

            imageView = (ImageView) convertView;  

       }  

        // getImageListenerimageView控件对象,默认图片地址,失败图片地址);  

       ImageListener listener = ImageLoader.getImageListener(imageView, android.R.drawable.ic_menu_rotate, android.R.drawable.ic_delete);  

        // get(图片地址,listener,宽,高);自动帮你处理图片的宽高再也不怕大图片的oom了  

        mImageLoader.get(url, listener,100,200);  

        return imageView;  

    }  

}  

--------------还需重写ImageCache这个类

 

 

public class <span style="font-family: Arial;">BitmapCache</span><span style="font-family: Arial;"> extends LruCache<String, Bitmap> implements ImageCache {</span>  

    // LruCache 原理:Cache保存一个强引用来限制内容数量,每当Item被访问的时候,此Item就会移动到队列的头部。 当cache已满的时候加入新

item时,在队列尾部的item会被回收。  

    // 解释:当超出指定内存值则移除最近最少用的图片内存  

    public static int getDefaultLruCacheSize() {  

        // 拿到最大内存  

       final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);  

       // 拿到内存的八分之一来做图片内存缓存  

       final int cacheSize = maxMemory / 8;  

   return cacheSize;  

    }  

  

    public BitmapLruCache() {  

        this(getDefaultLruCacheSize());  

    }  

  

    public BitmapLruCache(int sizeInKiloBytes) {  

        super(sizeInKiloBytes);  

    }  

  

   @Override  

    protected int sizeOf(String key, Bitmap value) {  

        return value.getRowBytes() * value.getHeight() / 1024;  

    }  

  

   @Override  

    public Bitmap getBitmap(String url) {  

       return get(url);  

   }  

  

   @Override  

    public void putBitmap(String url, Bitmap bitmap) {  

        put(url, bitmap);  

    }  

}  

 

 

   --NetWorkImageView

加载图片的控件com.android.volley.NetworkImageView

这个控件在被从父控件detach的时候,会自动取消网络请求的,即完全不用我们担心相关网络请求的生命周期问题,而且NetworkImageView还会根

据你对图片设置的widthheigh自动压缩该图片不会产生多的内存,还有NetworkImageView在列表中使用不会图片错误)

-----

使用

----

<com.android.volley.toolbox.NetworkImageView  

    android:id="@+id/network_image_view"  

    android:layout_width="100dp"  

    android:layout_height="100dp" />

        --Volley框架定义图片控制具有加载并缓存图片的能力

------

public class NetWorkImageActivity extends Activity {

 

 

NetworkImageView imageView=null;

RequestQueue queue=null;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_net_work_image);

imageView=(NetworkImageView) findViewById(R.id.imageview_network);

 

queue=Volley.newRequestQueue(this);

imageView.setDefaultImageResId(R.drawable.ic_launcher);

imageView.setErrorImageResId(R.drawable.ic_launcher);

}

public void loadnetwork(View view){

ImageLoader loader=new ImageLoader(queue, new ImageCache() {

int maxSize=1024*1024*4;

LruCache<String, Bitmap> cache=new LruCache<String, Bitmap>(maxSize){

protected int sizeOf(String key, Bitmap value) {

return value.getRowBytes()*value.getHeight();

};

};

@Override

public void putBitmap(String url, Bitmap bitmap) {

cache.put(url, bitmap);

}

 

@Override

public Bitmap getBitmap(String url) {

return cache.get(url);

}

});

String url="http://172.60.50.50:8080/MusicServer/images/disanji.jpg";

imageView.setImageUrl(url, loader);

}

}

----------

3.JsonRequest

------

public class BlankActivity extends Activity {

RequestQueue queue=null;

 

@Override  

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_blank);

queue=Volley.newRequestQueue(this);

}

public void onclick(View v){

JsonRequest<JSONObject> jsonRequest = null;

try {

String cityname = URLEncoder.encode("北京", "utf8");

String path = "http://op.juhe.cn/onebox/weather/query?cityname=" + cityname

+ "&dtype=&key=ea8441cb939845649b04948972f34db6";

jsonRequest = new JsonObjectRequest(path, null, new Listener<JSONObject>() {

@Override

public void onResponse(JSONObject response) {

Log.i("tag", response.toString());

}

}, new ErrorListener() {

 

 

@Override

public void onErrorResponse(VolleyError error) {

}

});

} catch (Exception e) {

}

queue.add(jsonRequest);

}

0 0
原创粉丝点击