android中實(shí)現(xiàn)加載網(wǎng)絡(luò)圖片并把圖片緩存到本地

1汇四、添加權(quán)限先锯玛,因?yàn)橐?qǐng)求網(wǎng)絡(luò)咐柜,并且存到本地,所以添加以下權(quán)限:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />

2攘残、布局activity_cache_bit_map.xml代碼,主要放一個(gè)imageView用于放圖片拙友,如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:layout_gravity="center"
    android:gravity="center"
    tools:context="cacheBitmapDemo.CacheBitMapActivity">
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="加載網(wǎng)絡(luò)圖片并緩存"
        android:id="@+id/btn_load_img"/>
    <ImageView
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:layout_marginTop="30dp"
        android:id="@+id/iv_img"/>
</LinearLayout>

3、添加CacheImageBean.java類歼郭,代碼如下:

package cacheBitmapDemo;

import android.graphics.Bitmap;
import android.widget.ImageView;

/**
 *
 * 作者:created by fanHongJiao
 */
public class CacheImageBean {
    public Bitmap bitmapFile;
    public ImageView gridImage;

    public Bitmap getBitmapFile() {
        return bitmapFile;
    }

    public void setBitmapFile(Bitmap bitmapFile) {
        this.bitmapFile = bitmapFile;
    }

    public ImageView getGridImage() {
        return gridImage;
    }

    public void setGridImage(ImageView gridImage) {
        this.gridImage = gridImage;
    }

    public CacheImageBean() {
    }
}

4遗契、添加工具類LocalCacheUtils.java,代碼如下:

package cacheBitmapDemo;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Environment;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

/**
 * 作者:created by fanHongJiao
 * 本地緩存
 */
public class LocalCacheUtils {
    private static final String CACHE_PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + "/WerbNews";
    private Context mContext;

    public LocalCacheUtils(Context context) {
        this.mContext = context;
    }

    public String getDiskCachePath(Context context) {
        String cachePath = null;
        if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) || !Environment.isExternalStorageRemovable()) {
            cachePath = context.getExternalCacheDir().getAbsolutePath();
        } else {
            cachePath = context.getCacheDir().getAbsolutePath();
        }
        return cachePath;
    }

    /**
     * 從本地讀取圖片
     *
     * @param url
     */
    public Bitmap getBitmapFromLocal(String url) {
        String fileName = null;//把圖片的url當(dāng)做文件名,并進(jìn)行MD5加密
        try {
            fileName = url;
            File file = new File(getDiskCachePath(mContext) + "/file/" + fileName);//文件保存路徑

            Bitmap bitmap = null;
            bitmap = BitmapFactory.decodeStream(new FileInputStream(file));
            if (!bitmap.equals(null)) {
                return bitmap;
            }
            return null;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 從網(wǎng)絡(luò)獲取圖片后,保存至本地緩存
     *
     * @param url
     * @param bitmap
     */
    public void setBitmapToLocal(String url, Bitmap bitmap) {
        try {

            String fileName = url;//把圖片的url當(dāng)做文件名,并進(jìn)行MD5加密
            File file = new File(getDiskCachePath(mContext) + "/file/" + fileName);//文件保存路徑
//通過(guò)得到文件的父文件,判斷父文件是否存在
            File parentFile = file.getParentFile();
            if (!parentFile.exists()) {
                parentFile.mkdirs();
            }
//把圖片保存至本地
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, new FileOutputStream(file));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

5、添加工具類NetCacheUtils,代碼如下:

package cacheBitmapDemo;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.widget.ImageView;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

/**
 *請(qǐng)求網(wǎng)絡(luò)圖片
 * 作者:created by fanHongJiao
 */
public class NetCacheUtils {
    private LocalCacheUtils mLocalCacheUtils;
    static
    {//輔助跳過(guò)證書
        try
        {
            trustAllHttpsCertificates();
            HttpsURLConnection.setDefaultHostnameVerifier
                    (
                            new HostnameVerifier()
                            {
                                public boolean verify(String urlHostName, SSLSession session)
                                {
                                    return true;
                                }
                            }
                    );
        } catch (Exception e)  {}
    }


    public NetCacheUtils(LocalCacheUtils localCacheUtils) {
        mLocalCacheUtils = localCacheUtils;
    }

    public NetCacheUtils() {
    }

    /**
     * 從網(wǎng)絡(luò)下載圖片
     *
     * @param ivPic 顯示圖片的imageview
     * @param url   下載圖片的網(wǎng)絡(luò)地址
     */
    public void getBitmapFromNet(ImageView ivPic, String url) {
        new BitmapTask().execute(ivPic, url);//啟動(dòng)AsyncTask
    }

    /**
     * AsyncTask就是對(duì)handler和線程池的封裝
     * 第一個(gè)泛型:參數(shù)類型
     * 第二個(gè)泛型:更新進(jìn)度的泛型
     * 第三個(gè)泛型:onPostExecute的返回結(jié)果
     */
    class BitmapTask extends AsyncTask<Object, Void, Bitmap> {
        private ImageView ivPic;
        private String url;

        /**
         * 后臺(tái)耗時(shí)操作,存在于子線程中
         *
         * @param params
         * @return
         */
        @Override
        protected Bitmap doInBackground(Object[] params) {
            ivPic = (ImageView) params[0];
            url = (String) params[1];
            return getURLimage(url);
        }

        /**
         * 更新進(jìn)度,在主線程中
         *
         * @param values
         */
        @Override
        protected void onProgressUpdate(Void[] values) {
            super.onProgressUpdate(values);
        }

        /**
         * 耗時(shí)方法結(jié)束后執(zhí)行該方法,主線程中
         *
         * @param result
         */
        @Override
        protected void onPostExecute(Bitmap result) {
            if (result != null) {
                ivPic.setImageBitmap(result);
                System.out.println("從網(wǎng)絡(luò)緩存圖片啦.....");
                //從網(wǎng)絡(luò)獲取圖片后,保存至本地緩存
                mLocalCacheUtils.setBitmapToLocal(url, result);
            }
        }
    }


    //加載圖片
    public Bitmap getURLimage(String url) {
        Bitmap bmp = null;
        try {
            URL myurl = new URL(url);
            // 獲得連接
            HttpURLConnection conn = (HttpURLConnection) myurl.openConnection();
            conn.setConnectTimeout(60000);//設(shè)置超時(shí)
            conn.setDoInput(true);
            conn.setUseCaches(false);//不緩存
            conn.connect();
            InputStream is = conn.getInputStream();//獲得圖片的數(shù)據(jù)流
            bmp = BitmapFactory.decodeStream(is);//讀取圖像數(shù)據(jù)
            is.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bmp;
    }

    private static void trustAllHttpsCertificates()   throws NoSuchAlgorithmException, KeyManagementException
    {
        TrustManager[] trustAllCerts = new TrustManager[1];
        trustAllCerts[0] = new TrustAllManager();
        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustAllCerts, null);
        HttpsURLConnection.setDefaultSSLSocketFactory(
                sc.getSocketFactory());
    }

    private static class TrustAllManager implements X509TrustManager
    {
        public X509Certificate[] getAcceptedIssuers()
        {
            return null;
        }
        public void checkServerTrusted(X509Certificate[] certs,
                                       String authType)
                throws CertificateException {
        }
        public void checkClientTrusted(X509Certificate[] certs,
                                       String authType)
                throws CertificateException {
        }
    }
}

6病曾、添加工具類MyBitmapUtils類牍蜂,代碼如下:

package cacheBitmapDemo;

import android.content.Context;
import android.graphics.Bitmap;
import android.widget.ImageView;

/**
 * 自定義圖片加載工具
 * 作者:created by fanHongJiao
 */
public class MyBitmapUtils {
    private NetCacheUtils mNetCacheUtils;
    private LocalCacheUtils mLocalCacheUtils;
    private Context mContext;

    public MyBitmapUtils(Context context) {
        this.mContext = context;
        mLocalCacheUtils = new LocalCacheUtils(context);
        mNetCacheUtils = new NetCacheUtils(mLocalCacheUtils);
    }

    /**
     * @param ivPic imageView
     * @param url 圖片地址
     * @return
     */
    public Bitmap disPlay(ImageView ivPic, String url) {
        //本地緩存
        Bitmap bitmap = mLocalCacheUtils.getBitmapFromLocal(url);
        if (bitmap != null) {
            return bitmap;
        }
        //網(wǎng)絡(luò)加載圖片,在沒有緩存的情況下去請(qǐng)求網(wǎng)絡(luò)圖片泰涂,并將圖片保存在本地文件夾
        mNetCacheUtils.getBitmapFromNet(ivPic, url);
        return bitmap;

    }
}

7鲫竞、CacheBitMapActivity代碼如下:

package cacheBitmapDemo;
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import com.example.viewpaerdemo.R;
import java.net.URL;
/**
 * 網(wǎng)絡(luò)圖片緩存demo
 * 加載網(wǎng)絡(luò)圖片,每次進(jìn)來(lái)先加載網(wǎng)絡(luò)圖片逼蒙,并且緩存圖片到本地从绘;
 * 如果沒有網(wǎng)絡(luò)或者加載網(wǎng)絡(luò)圖片不成功,就從本地加載緩存的圖片
 */
public class CacheBitMapActivity extends AppCompatActivity implements View.OnClickListener {
    Button btnLoadImg;
    ImageView ivImg;
    private MyBitmapUtils myBitmapUtils;
    private String imagUrl="https://i.625u.com/d/img/52353547.jpg";//圖片的url

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_cache_bit_map);
        initView();
    }

    private void initView() {
        btnLoadImg = findViewById(R.id.btn_load_img);
        btnLoadImg.setOnClickListener(this);
        ivImg = findViewById(R.id.iv_img);
    }

    @Override
    public void onClick(View view) {
        if (view.getId() == R.id.btn_load_img) {
            myBitmapUtils = new MyBitmapUtils(this);
            Bitmap imageFile = myBitmapUtils.disPlay(ivImg, imagUrl);
            CacheImageBean imageGrid = new CacheImageBean();
            imageGrid.setBitmapFile(imageFile);
            imageGrid.setGridImage(ivImg);
            Message msg = Message.obtain();
            msg.obj = imageGrid;
            msg.what = 100;
            handler.sendMessage(msg);
        }
    }

    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case 100:
                    CacheImageBean obj = (CacheImageBean) msg.obj;
                    obj.getGridImage().setImageBitmap(obj.getBitmapFile());
                    //Glide加載圖片,直接加載本地圖片所在文件
//                    Glide.with(mContext).load((Bitmap)obj.getBitmapFile()).into(obj.getGridImage());
                    //Glide加載圖片,用網(wǎng)絡(luò)圖片的url加載圖片
//                    ivImage.setImageBitmap((Bitmap)msg.obj);
            }
        }
    };
}

效果圖如下:


2.jpg

完結(jié)是牢。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末僵井,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子驳棱,更是在濱河造成了極大的恐慌批什,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件社搅,死亡現(xiàn)場(chǎng)離奇詭異驻债,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)罚渐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門却汉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人荷并,你說(shuō)我怎么就攤上這事∏嗳樱” “怎么了源织?”我有些...
    開封第一講書人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵翩伪,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我谈息,道長(zhǎng)缘屹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任侠仇,我火速辦了婚禮轻姿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘逻炊。我一直安慰自己互亮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開白布余素。 她就那樣靜靜地躺著豹休,像睡著了一般。 火紅的嫁衣襯著肌膚如雪桨吊。 梳的紋絲不亂的頭發(fā)上威根,一...
    開封第一講書人閱讀 49,842評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音视乐,去河邊找鬼洛搀。 笑死,一個(gè)胖子當(dāng)著我的面吹牛佑淀,可吹牛的內(nèi)容都是我干的咆疗。 我是一名探鬼主播院塞,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蕊退?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤朴沿,失蹤者是張志新(化名)和其女友劉穎岸夯,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體隘道,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡症歇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了谭梗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片忘晤。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖激捏,靈堂內(nèi)的尸體忽然破棺而出设塔,到底是詐尸還是另有隱情,我是刑警寧澤远舅,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布闰蛔,位于F島的核電站痕钢,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏序六。R本人自食惡果不足惜任连,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望例诀。 院中可真熱鬧随抠,春花似錦、人聲如沸繁涂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)爆土。三九已至椭懊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間步势,已是汗流浹背氧猬。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留坏瘩,地道東北人盅抚。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像倔矾,于是被迫代替她去往敵國(guó)和親妄均。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容