Android第三方异步网路加载库AsyncHttpClient内部实现缓存策略了吗?



Android第三方异步网路加载库AsyncHttpClient内部实现缓存策略了吗?

Android平台上的AsyncHttpClient是一款比较流行的Android异步网路加载库,在github上的网址是:https://github.com/loopj/android-async-http
但是AsyncHttpClient和另外比较著名的Android异步网络库 Volley和Glide不同的是,不像Volley和Glide内部已经实现好了缓存策略,AsyncHttpClient自身没有实现缓存策略。
实验可以表明这点。
实验方法:我写一个简单的Android小程序,仅仅加载一张从网络获取的图片(我的CSDN博客头像),在联网时候启动这个程序,然后关闭手机设备的所以网络连接,此时再次启动该程序。
先给出测试的程序所有代码:
测试的主Activity:MainActivity.java

package zhangphil.http;

import org.apache.http.Header;

import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.widget.ImageView;

public class MainActivity extends Activity {

	private final String url = "http://avatar.csdn.net/9/7/A/1_zhangphil.jpg";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		setContentView(R.layout.activity_main);

		final ImageView imageView = (ImageView) findViewById(R.id.imageView);

		AsyncHttpClient httpclient = new AsyncHttpClient();

		httpclient.get(url, new AsyncHttpResponseHandler() {

			@Override
			public void onSuccess(int statusCode, Header[] headers,
					byte[] response) {

				BitmapFactory bitmapFactory = new BitmapFactory();
				Bitmap bitmap = bitmapFactory.decodeByteArray(response, 0,
						response.length);
				imageView.setImageBitmap(bitmap);
			}

			@Override
			public void onFailure(int statusCode, Header[] headers,
					byte[] response, Throwable error) {
				error.printStackTrace();
			}
		});
	}
}

布局文件activity_main.xml仅仅只有一个id为imageView的ImageView元素,在此不在赘述。

测试时候不要忘记添加网络访问权限,除此之外,我特意给这个测试程序添加了读写Android存储设备的权限。
实验发现,在联网状态下,ImageView的图片可以加载出来,在断网情况下ImageView无法加载出来,在错误日志中同样说明每次启动程序AsyncHttpClient都同样的去联网,即便是相同的URL资源。
查看AsyncHttpClient的源代码(截止本文写作时候的版本android-async-http-1.4.8,时间是2015年9月20,也许在未来,作者不排除像Android Volley或者Glide那样在内部把缓存策略一并实现),果然,AsyncHttpClient内部没有实现缓存策略。
这样就使得开发者在使用AsyncHttpClient时候需要特别注意,当代码中需要实现或者使用缓存时候,AsyncHttpClient无能为力,必须自己写一套缓存策略,或者仅仅使用AsyncHttpClient加载一些对缓存不敏感的代码开发场景,在一些缓存敏感(比如代码需要频繁的从网络读取大图片,但这些大图片数据在较短时间内是相同的)场景,可以考虑使用Android Volley或者Glide(Android Volley更深度的使用缓存,甚至在网络请求json数据时候也会不失时机的缓存!)。但是AsyncHttpClient有一个好处:就是在处理http网络数据交互时候,代码运行比较稳定。


附我写的一些参考文章:
《Android图片加载与缓存开源框架:Android Glide》
文章链接:http://blog.csdn.net/zhangphil/article/details/45535693

你可能感兴趣的:(android)