android volley 进度,Android Volley 的使用总结

上个周末去4S店保养, 抽空把Volley学习了一下,

参考的是这篇文章: http://blog.csdn.net/guolin_blog/article/details/17482095

这篇文章对一些关键的知识点进行一下总结:

背景:

Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient,不过HttpURLConnection和HttpClient的用法还是稍微有些复杂的,如果不进行适当封装的话,很容易就会写出不少重复代码。于是乎,一些Android网络通信框架也就应运而生. google 2013年推出的Volley可是说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片。它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作, 例如像微博这样的APP.

StringRequest的使用方法:

1. 调用Volley的static方法 newRequestQueue(context),

得到RequestQueue对象, 之后所有的网络请求都添加到这个RequestQueue对象就可以了.

RequestQueue mQueue = Volley.newRequestQueue(context);

2. new一个StringRequest对象, 访问url, 得到服务端返回的字符串.

StringRequest stringRequest = new StringRequest("http://www.baidu.com",

new Response.Listener() {

@Override

public void onResponse(String response) {

Log.d("TAG", response);

}

}, new Response.ErrorListener() {

@Override

public void onErrorResponse(VolleyError error) {

Log.e("TAG", error.getMessage(), error);

}

});

StringRequest的构造函数需要传入三个参数,第一个参数就是目标服务器的URL地址,第二个参数是服务器响应成功的回调,第三个参数是服务器响应失败的回调。

3. 最后,将这个StringRequest对象添加到RequestQueue里面就可以了.

mQueue.add(stringRequest);

4. 默认是GET请求, 如果要使用POST请求的话, 就需要使用带4个参数的StringRequest()构造方法. 请求参数通过重写父类Request中的getParams()方法来设置.

StringRequest stringRequest = new StringRequest(Method.POST, url, listener, errorListener) {

@Override

protected Map getParams() throws AuthFailureError {

Map map = new HashMap();

map.put("params1", "value1");

map.put("params2", "value2");

return map;

}

};

JsonRequest的用法

JsonRequest有两个直接的子类,JsonObjectRequest和JsonArrayRequest,一个是用于请求一段JSON数据的,一个是用于请求一段JSON数组的。

使用方法和StringRequest类似.

JsonObjectRequest jsonObjectRequest = new JsonObjectRequest("http://m.weather.com.cn/data/101010100.html", null,

new Response.Listener() {

@Override

public void onResponse(JSONObject response) {

Log.d("TAG", response.toString());

}

}, new Response.ErrorListener() {

@Override

public void onErrorResponse(VolleyError error) {

Log.e("TAG", error.getMessage(), error);

}

});

mQueue.add(jsonObjectRequest);

之前提过,Volley是将AsyncHttpClient和Universal-Image-Loader的优点集成于一身的一个框架。我们都知道,Universal-Image-Loader具备非常强大的加载网络图片的功能,而使用Volley,我们也可以实现基本类似的效果,并且在性能上也豪不逊色于Universal-Image-Loader,下面我们就来具体学习一下吧。

ImageRequest的用法

ImageRequest imageRequest = new ImageRequest(

"http://developer.android.com/images/home/aw_dac.png",

new Response.Listener() {

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

}

});

第三第四个参数分别用于指定允许图片最大的宽度和高度,如果指定的网络图片的宽度或高度大于这里的最大值,则会对图片进行压缩,指定成0的话就表示不管图片有多大,都不会进行压缩。第五个参数用于指定图片的颜色属性,其中ARGB_8888可以展示最好的颜色属性,每个图片像素占据4个字节的大小,而RGB_565则表示每个图片像素占据2个字节大小。

第六个参数是图片请求失败的回调,这里我们当请求失败时在ImageView中显示一张默认图片。

最后把这个ImageRequest对象添加到RequestQueue对象中去就可以了.

mQueue.add(imageRequest);

ImageLoader的用法

为了让开发者更方便的加载网络图片, Volley还提供了ImageLoader, 并且它的内部也是使用ImageRequest来实现的,不过ImageLoader明显要比ImageRequest更加高效,因为它不仅可以帮我们对图片进行缓存,还可以过滤掉重复的链接,避免重复发送请求。

分为以下几步:

创建一个ImageLoader对象

ImageLoader imageLoader = new ImageLoader(mQueue, new ImageCache() {

@Override

public void putBitmap(String url, Bitmap bitmap) {

}

@Override

public Bitmap getBitmap(String url) {

return null;

}

});

//这里并没有让ImageLoader具备缓存功能.

获取一个ImageListener对象

ImageListener listener = ImageLoader.getImageListener(imageView,

R.drawable.default_image, R.drawable.failed_image);

//第一个参数指定用于显示图片的ImageView控件,

//第二个参数指定加载图片的过程中显示的图片,第三个参数指定加载图片失败的情况下显示的图片。

调用ImageLoader的get()方法加载网络上的图片

imageLoader.get("https://img-my.csdn.net/uploads/201404/13/1397393290_5765.jpeg", listener);

要使用到ImageLoader的缓存功能, 就需要提供一个ImageCache接口的实现类.

这里, 我们在实现的内部通过Android framework提供的LruCache实现缓存.

public class BitmapCache implements ImageCache {

private LruCache mCache;

public BitmapCache() {

int maxSize = 10 * 1024 * 1024; //提供一个10Mb的缓存.

mCache = new LruCache(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的用法

除了以上两种方式之外,Volley还提供了第三种方式来加载网络图片,即使用NetworkImageView。不同于以上两种方式,NetworkImageView是一个自定义控件,它是继承自ImageView的,具备ImageView控件的所有功能,只是在原生的基础之上加入了加载网络图片的功能。

在布局文件中使用NetworkImageView控件

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical" >

android:id="@+id/button"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Send Request" />

android:id="@+id/network_image_view"

android:layout_width="200dp"

android:layout_height="200dp"

android:layout_gravity="center_horizontal"

/>

networkImageView = (NetworkImageView) findViewById(R.id.network_image_view);

networkImageView.setDefaultImageResId(R.drawable.default_image);

networkImageView.setErrorImageResId(R.drawable.failed_image);

networkImageView.setImageUrl("https://img-my.csdn.net/uploads/201404/13/1397393290_5765.jpeg",

imageLoader);

//这里分别设置加载中显示的图片,加载失败时显示的图片,以及目标图片的URL地址.

//其中,setImageUrl()方法接收两个参数,第一个参数用于指定图片的URL地址,第二个参数则是前面创建好的ImageLoader对象.

NetworkImageView是一个控件,在加载图片的时候它会自动获取自身的宽高,然后对比网络图片的宽度,再决定是否需要对图片进行压缩。也就是说,压缩过程是在内部完全自动化的,并不需要我们关心,NetworkImageView会始终呈现给我们一张大小刚刚好的网络图片,不会多占用任何一点内存,这也是NetworkImageView最简单好用的一点吧。

当然了,如果你不想对图片进行压缩的话,其实也很简单,只需要在布局文件中把NetworkImageView的layout_width和layout_height都设置成wrap_content就可以了,这样NetworkImageView就会将该图片的原始大小展示出来,不会进行任何压缩.

自定义XMLRequest

网络上传输的数据通常有两种格式,JSON和XML,Volley并没有提供支持XML数据的网络请求,但Volley提供了非常强的扩展机制,使得我们可以很轻松地定制出任意类型的Request.

仿照StringRequest写XMLRequest就行, StringRequest一共才70多行的代码, 仿照写也是比较容易的.

=======DONE============

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用 Android Volley 库来下载文件。下面是一个简单的示例代码: ```java String fileUrl = "http://www.example.com/file.pdf"; String fileName = "file.pdf"; StringRequest downloadRequest = new StringRequest(Request.Method.GET, fileUrl, new Response.Listener<String>() { @Override public void onResponse(String response) { // 文件下载完成,执行相应操作 } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // 文件下载出错,处理错误情况 } }) { @Override public Map<String, String> getHeaders() throws AuthFailureError { Map<String, String> headers = new HashMap<>(); // 如果需要,可以在这里设置请求头 return headers; } @Override protected Response<String> parseNetworkResponse(NetworkResponse response) { // 在这里获取文件名 String contentDisposition = response.headers.get("Content-Disposition"); if (contentDisposition != null) { String[] parts = contentDisposition.split(";"); for (String part : parts) { if (part.trim().startsWith("filename")) { fileName = part.split("=")[1].trim(); break; } } } return super.parseNetworkResponse(response); } }; // 添加请求请求队列 Volley.newRequestQueue(context).add(downloadRequest); ``` 上述代码中,你需要替换 `fileUrl` 为要下载的文件的 URL,`fileName` 为要保存的文件名。你可以在 `onResponse` 方法中处理文件下载完成后的操作,而在 `onErrorResponse` 方法中处理下载出错的情况。如果需要设置请求头,可以在 `getHeaders` 方法中添加相应的请求头。在 `parseNetworkResponse` 方法中,你可以根据需要从响应的头信息中获取文件名。 请确保在使用 Volley 之前已经在你的项目中添加了 Volley 的依赖。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值