刚刚看了郭霖大神的volley系列,只能深深的膜拜,膜拜完以后,我们还是老老实实的跟着大神的脚步来具体操练一下。volley是现在最流行的同网络频繁交互数据的开源工具,volley的特点是适合频繁的小量数据的交互,不适合大量数据的交互,在我看来,我们一般的App处理都是小量数据的交互。
掌握volley的用法,主要就是掌握以下几个对象的使用:
1.StringRequest.接受返回为String的数据;
2.jsonRequest.接受返回为Json的数据;
3.ImageLoader.接受返回为图片的数据.
1.StringRequest的用法
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext=this;
//第一步,必须要获取到RequestQueue对象,一般一个Activity得到一个就够
RequestQueue mQueue=Volley.newRequestQueue(mContext);</span>
//第二步,由于我们要接受返回为string形式的数据,所以我们实例化一个StringRequest对象
@SuppressWarnings("unchecked")
StringRequest stringRequest=new StringRequest("http://www.baidu.com", new Response.Listener(){
@Override
public void onResponse(Object response) {
// TODO Auto-generated method stub
Log.e("wj", "response:"+response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// TODO Auto-generated method stub
Log.e("wj", "error:"+error);
}
});
<span style="white-space:pre"> </span>//第三部,我们将StringRequest对象添加到RequestQueue里面
mQueue.add(stringRequest);</span>
}</span>
StringRequest stringRequest=new StringRequest(Method.POST, url, listener, 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;
}
};</span>
2.jsonRequest的用法:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext=this;
tv=(TextView) findViewById(R.id.tv);
final ProgressDialog progressDialog=ProgressDialog.show(mContext, "This is title", "loading");
//第一步
RequestQueue mQueue=Volley.newRequestQueue(mContext);
//第二步
@SuppressWarnings({ "unchecked", "rawtypes" })
JsonObjectRequest jsonObjectRequest=new JsonObjectRequest("http://www.weather.com.cn/data/sk/101010100.html", null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
// TODO Auto-generated method stub
Log.e("wj", "response:"+response);
String city=null;
try {
JSONObject jsonObject=(JSONObject) response.get("weatherinfo");
city=(String) jsonObject.get("city");
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
tv.setText(city);
if(progressDialog.isShowing()&&progressDialog!=null){
progressDialog.dismiss();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// TODO Auto-generated method stub
Log.e("wj", "error:"+error);
}
});
//第三步
mQueue.add(jsonObjectRequest);
}</span>
这里jsonObjectRequest构造函数的第二个参数作用是:如果是null说明我们用的是get请求,如果不为null说明我们用的是post请求。OK,这里我还加入了一个progressdialog,让我们的程序更实用,同时我对返回的json稍微解析了一下,把城市的名字放在了我们配置文件中的TextView中。
接下来就是我们最头疼,也是最美的图片部分了............................................
3.ImageRequest
必须先上一张图,看到结果我们才有动力
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext=this;
iv_g=(ImageView) findViewById(R.id.iv);
final ProgressDialog dialog=ProgressDialog.show(mContext, null, "Loading...");
RequestQueue mQueue=Volley.newRequestQueue(mContext);
ImageRequest imageRequest=new ImageRequest("http://t10.baidu.com/it/u=4189675059,3919880875&fm=59", new Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
// TODO Auto-generated method stub
iv_g.setImageBitmap(response);
if(dialog.isShowing()&&dialog!=null){
dialog.dismiss();
}
}
}, 0, 0, Config.RGB_565, new ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// TODO Auto-generated method stub
}
});
mQueue.add(imageRequest);
}</span>
第一个参数就是图片的URL地址,这个没什么需要解释的。第二个参数是图片请求成功的回调,这里我们把返回的Bitmap参数设置到ImageView中。第三第四个参数分别用于指定允许图片最大的宽度和高度,如果指定的网络图片的宽度或高度大于这里的最大值,则会对图片进行压缩,指定成0的话就表示不管图片有多大,都不会进行压缩。第五个参数用于指定图片的颜色属性,Bitmap.Config下的几个常量都可以在这里使用,其中ARGB_8888可以展示最好的颜色属性,每个图片像素占据4个字节的大小,而RGB_565则表示每个图片像素占据2个字节大小。第六个参数是图片请求失败的回调,这里一般我们当请求失败时在ImageView中显示一张默认图片。接下来我们将volley对图片操作的更好用的一个工具ImageLoader。由于ImageLoader已经不是继承自Request了,所以它的用法也和我们之前学到的内容有所不同,总结起来大致可分为以下四步:
1.创建一个RequestQueue对象。
2.创建一个ImageLoader对象。
3.获取一个ImageListener对象。
4.调用ImageLoader的get()方法加载网络上的图片。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext=this;
iv_g=(ImageView) findViewById(R.id.iv);
//1创建一个RequestQueue对象
RequestQueue mQueue=Volley.newRequestQueue(mContext);
//2.创建一个ImageLoader对象
ImageLoader imageLoader=new ImageLoader(mQueue,</span><span style="color:#ff0000;">new ImageCache()</span><span style="color:#333333;"> {
@Override
public void putBitmap(String url, Bitmap bitmap) {
// TODO Auto-generated method stub
}
@Override
public Bitmap getBitmap(String url) {
// TODO Auto-generated method stub
return null;
}
});
//3.获取一个ImageListener对象(绑定需要监听的ImageView控件)
ImageListener imageListener=ImageLoader.getImageListener(iv_g,
R.drawable.ic_launcher, R.drawable.ic_launcher);
//4.调用imageLoader的get(url,listener)方法
imageLoader.get("http://t10.baidu.com/it/u=4189675059,3919880875&fm=59", imageListener,200,200);
}</span></span>
get方法有两个构造函数,大家都试试,后边带两个大小的是限制图片的大小。这里有人会感到疑惑ImageCache是个干什么用的,我们知道在图片加载的时候我们往往会对其进行缓存,包括一级缓存和二级缓存,ImageCache就是vollery专门给我们放出来,让我选择性的实现自己的缓存需求。所以我们往往会重写此方法,同样用LruCache功能对图片进行缓存(LruCache是最好用的内从缓存)
这里我们新建一个BitmapCache并实现ImageCache接口,代码如下:
class BitmapCache implements ImageCache{
private LruCache<String, Bitmap> lruCache;
public BitmapCache() {
//得到此程序运行时系统分配的内存,然后用它的十分之1作为我们分配给图片的内存缓存空间
int maxSize=(int) (Runtime.getRuntime().maxMemory()/10);
Log.e("wj", maxSize+"");
lruCache=new LruCache<String, Bitmap>(maxSize){
@Override
protected int sizeOf(String key, Bitmap value) {
// TODO Auto-generated method stub
return value.getRowBytes()*value.getHeight();
}
};
}
@Override
public Bitmap getBitmap(String url) {
// TODO Auto-generated method stub
return lruCache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
// TODO Auto-generated method stub
lruCache.put(url, bitmap);
}
}</span>
那么我们就可以简化上面那个代码了
//2.创建一个ImageLoader对象
ImageLoader imageLoader=new ImageLoader(mQueue,new BitmapCache());</span>
同时大家有没有看到,上面缓存的时候我用了运行时系统分配的内存大小,下面:
12-10 08:31:37.171: E/wj(1227): </span><span style="color:#ff0000;"><span style="color:#ff0000;">3355443</span></span></span>
最后一个控件,NetworkImageView。我认为是最实用 的一个控件,同样是vollery提供用来加载网络图片的,我们往往在项目中会有很多图片,我们不可能对每一个图片都像上面那样详细的处理,所以我们更多的会用到这个控件,下面我来看看具体的用法:
1.创建一个RequestQueue对象
2.创建一个ImageLoader对象
3.在布局文件中添加一个NetworkimageView控件
4.在代码中获取该控件的实例
5.设置要加载图片地址
配置文件.xml
<com.android.volley.toolbox.NetworkImageView
android:id="@+id/netIV"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="Beautiful Gao yuan yuan "/></span>
Activity中
package com.wj.volley;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.ImageLoader.ImageCache;
import com.android.volley.toolbox.NetworkImageView;
import com.android.volley.toolbox.Volley;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.v4.util.LruCache;
import android.util.Log;
public class MainActivity extends Activity {
private Context mContext;
private NetworkImageView iv_g;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext=this;
//4.在代码中获得该控件
iv_g=(NetworkImageView) findViewById(R.id.netIV);
//1创建一个RequestQueue对象
RequestQueue mQueue=Volley.newRequestQueue(mContext);
//2.创建一个ImageLoader对象
ImageLoader imageLoader=new ImageLoader(mQueue,new BitmapCache());
//5.设置要加载的图片路径
iv_g.setImageUrl("http://t10.baidu.com/it/u=4189675059,3919880875&fm=59", imageLoader);
}
class BitmapCache implements ImageCache{
private LruCache<String, Bitmap> lruCache;
public BitmapCache() {
//得到此程序运行时系统分配的内存,然后用它的十分之1作为我们分配给图片的内存缓存空间
int maxSize=(int) (Runtime.getRuntime().maxMemory()/10);
Log.e("wj", maxSize+"");
lruCache=new LruCache<String, Bitmap>(maxSize){
@Override
protected int sizeOf(String key, Bitmap value) {
// TODO Auto-generated method stub
return value.getRowBytes()*value.getHeight();
}
};
}
@Override
public Bitmap getBitmap(String url) {
// TODO Auto-generated method stub
return lruCache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
// TODO Auto-generated method stub
lruCache.put(url, bitmap);
}
}
}
</span>
OK 基本知识都操练一遍,具体遇到问题留待以后项目中再来补充吧 。要动手啊................