android 下載圖片並緩存

      此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);
        }
    }
}

運行截圖:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章