volley,访问网络,聚合天气数据

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() {
@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() {
@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

}

=========

应用实例

public class ImageAdapter extends ArrayAdapter {

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;
}
// getImageListener(imageView控件对象,默认图片地址,失败图片地址);
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 BitmapCache extends LruCache

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

使用

–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

}

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 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() {
@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);
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值