此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);
}
}
}
運行截圖: