闲来无事,弄一个图片加载的框架。 希望各位看官多批评指教。
基本设计的想法是 开一个 阻塞线程,等待加载任务,有任务以后加载,然后回调通知,并且在缓存一份。
首先是大体结构的UML 类图:
实现的想法:
BitmapLoader 内有一个线程,在无任务时候阻塞,当添加新任务后唤醒线程,执行BaseMission的load()方法。
当load()方法加载完返回Bitmap,并且通过IUpdate更新相应视图,或者缓存等。
通过工厂生成Mission实例。
工厂代码:
public class MissionFactory {
// 从assets读
public static BaseMission createMission(String mark, IUpdate cb, String fn, Context ctx){
BaseMission mission = new AssetsMission(mark, cb, fn, ctx);
return mission ;
}
// 从sd卡读
public static BaseMission createMission(String mark, IUpdate cb, String uri){
BaseMission mission = new SimpleSDMission(mark, cb, uri);
return mission ;
}
// 从sd卡 读,并且自动缩放
public static BaseMission createMission(String mark, IUpdate cb, String uri, int w, int h){
BaseMission mission = new AdvSDMission(mark, cb, uri, w, h);
return mission ;
}
}
Demo:
Activity 的 onCreate方法:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
path = Environment.getExternalStorageDirectory().getAbsolutePath()+ "/pic/3.jpg" ;
mHandler = new Handler(getMainLooper(), new HandlerCallback());
testImageView = (ImageView) findViewById(R.id.iv_test); // 展示用的视图
cb = new Updater(); //IUpdater 的实例
testImageView.post(new Runnable() {
@Override
public void run() {
mHandler.sendEmptyMessage(0);
}
});
}
Updater :
class Updater implements IUpdate{
@Override
public void update(String mark, final Bitmap bm) {
testImageView.post(new Runnable() {
@Override
public void run() {
testImageView.setImageBitmap(bm);
Random rnd = new Random();
int type = rnd.nextInt(3);
mHandler.sendEmptyMessageDelayed(type, 1000);
}
});
}
}
HandlerCallback :
class HandlerCallback implements Handler.Callback{
@Override
public boolean handleMessage(Message msg) {
BaseMission mission ;
switch (msg.what) {
case 0:
mission = MissionFactory.createMission("my", cb, "1.jpg", TestActivity.this); // Assets目录下的图片
break;
case 1:
mission = MissionFactory.createMission("test", cb, path);
break;
case 2:
mission = MissionFactory.createMission("test3", cb, path, 100, 100);
break;
default:
mission = MissionFactory.createMission("my", cb, "1.jpg", TestActivity.this);
break;
}
BitmapLoader.getInstance().addMission(mission);
return true;
}
}