此demo演示android 下载图片并缓存,并显示的过程。
demo:下载地址
打开权限:
<uses-permission android:name="android.permission.INTERNET"/>
源码:
package fk.androiddemo_023;
import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Message;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import java.lang.ref.SoftReference;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
//从服务器下载图片并缓存
public class MainActivity extends Activity implements View.OnClickListener{
Button but;
ImageView imageView;
MyHandler handler;
String imageUrl;
//用于缓存图片
private Map<String, SoftReference<Drawable>> imageCache;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
but = (Button) findViewById(R.id.button);
but.setOnClickListener(this);
imageView = (ImageView) findViewById(R.id.imageView);
handler = new MyHandler();
imageCache = new HashMap<>();
//下载地址
imageUrl = "http://mystudy.bj.bcebos.com/testImg.jpg";
}
@Override
public void onClick(View v) {
if (loadDrawable()) {//如果为true,图片已被缓存
//根据缓存key,得到图片并显示
imageView.setImageDrawable(imageCache.get(imageUrl).get());
}
}
public Boolean loadDrawable() {//判断图片是否有缓存
if (imageCache.containsKey(imageUrl)) {
SoftReference<Drawable> softReference = imageCache.get(imageUrl);
if (softReference.get() != null) {
return true;//有缓存,返回true
}
}
new MyThread().start();//没有缓存,去下载,返回false
return false;
}
class MyThread extends Thread {
public void run() {
Drawable drawable = loadImageFromUrl(imageUrl);//下载图片
if(drawable!=null){//下载成功
imageCache.put(imageUrl, new SoftReference<>(drawable));//把图片放入缓存
//通知主线程图片已经下载好,并把图片资源传送过去
Message message = handler.obtainMessage(0, drawable);
handler.sendMessage(message);
}
}
}
public Drawable loadImageFromUrl(String imageUrl) {
try {
//从服务器下载获得图片资源
return Drawable.createFromStream(new URL(imageUrl).openStream(), "src");
} catch (Exception e) {
System.out.println(e+"下载失败!!!!!!!!");
return null;
}
}
class MyHandler extends Handler {
@Override
public void handleMessage(Message msg) {
//显示图片
imageView.setImageDrawable((Drawable) msg.obj);
}
}
}
运行截图: