rxjava 2.x+retrofit 通過動(dòng)態(tài)url保存網(wǎng)絡(luò)圖片到本地

封面.jpg

經(jīng)常需要下載網(wǎng)絡(luò)上的圖片到本地闯参,比如用戶頭像之類的哑蔫,這里采用rxjava+retrofit的形式去實(shí)現(xiàn)這個(gè)功能


HttpManager 類:就是一個(gè)通過單例模式實(shí)現(xiàn)的類后德,獲取retrofit的一個(gè)實(shí)例來調(diào)用NetApi接口內(nèi)聲明的方法友扰,此處只寫關(guān)鍵的一部分,別的相信你們都會(huì)

    public <T> T getHttpApi(Class<T> service) {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URl)
                .client(getClient())
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();

        return retrofit.create(service);
    }

BASE_URl 是你定義的域名比如:http://www.xxxx.com:8080之類的

NetApi接口:


@GET

@Streaming

Observable<ResponseBody> downloadImg(@Url String  imgUrl);

注意注解
@GET后面不加任何東西格了,平時(shí)的都是@GET("api/getuserinfo")之類的和上面的那個(gè)BASE_URl拼接起來生成url:
http://www.xxxx.com:8080/api/getuserinfo?請(qǐng)求條件=xx
然后去請(qǐng)求,這里采用@Url注解的方式就不用那么麻煩了
@Url 此處是動(dòng)態(tài)url即網(wǎng)絡(luò)圖片的url徽鼎,需要從外部傳入盛末,如度娘圖標(biāo)url:
https://www.baidu.com/img/superlogo_c4d7df0a003d3db9b65e9ef0fe6da1ec.png
用字符串的形式傳入即可

Presenter類 :發(fā)起網(wǎng)絡(luò)請(qǐng)求把得到的圖片二進(jìn)制流轉(zhuǎn)化為bitmap對(duì)象,再通過bitmap對(duì)象保存到本地指定目錄下

  /**
     * 指定線程下載文件(異步)否淤,非阻塞式下載
     *
     * @param url       圖片url
     * @param savePatch 下載文件保存目錄
     * @param fileName  文件名稱(不帶后綴)
     * 
     */
    public void downloadFile(String url, final String savePatch, final String fileName) {
        HttpManager.getInstance().getHttpApi(NetApi.class)
                .downloadImg(url)
                .subscribeOn(Schedulers.io())
                .observeOn(Schedulers.newThread())
                .subscribe(new DisposableObserver<ResponseBody>() {
                    @Override
                    public void onNext(ResponseBody responseBody) {
                        Bitmap bitmap = null;
                        byte[] bys;
                        try {
                            bys = responseBody.bytes();
                            bitmap = BitmapFactory.decodeByteArray(bys, 0, bys.length);

                            try {
                                FileUtils.saveImg(bitmap, savePatch, fileName);
                                String savePath = savePatch + File.separator + fileName + ".jpg";
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        } catch (IOException e) {
                            e.printStackTrace();
                        }

                        if (bitmap != null) {
                            bitmap.recycle();
                        }
                    }

                    @Override
                    public void onError(Throwable e) {
                        //你的處理
                    }

                    @Override
                    public void onComplete() {
                        //你的處理
                    }
                });
    }

decodeByteArray是BitmapFactory內(nèi)的方法悄但,把二進(jìn)制流轉(zhuǎn)化為bitmap,需要導(dǎo)入系統(tǒng)包:
import android.graphics.BitmapFactory;

FileUtils類:IO操作石抡,把圖片保存到本地:

/**
     * 保存圖片到SD卡
     *
     * @param bm         圖片bitmap對(duì)象
     * @param floderPath 下載文件保存目錄
     * @param fileName   文件名稱(不帶后綴)
     */
    public static void saveImg(Bitmap bm, String floderPath, String fileName) throws IOException {
        //如果不保存在sd下面下面這幾行可以不加
        if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            Log.e("SD卡異常");
            return;
        }

        File folder = new File(floderPath);
        if (!folder.exists()) {
            folder.mkdirs();
        }

        String savePath = folder.getPath() + File.separator + fileName + ".jpg";
        File file = new File(savePath);
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));
        bm.compress(Bitmap.CompressFormat.JPEG, 80, bos);
        Log.d(savePath + " 保存成功");
        bos.flush();
        bos.close();
    }

在你的service或者activity中調(diào)用:

mPresenter.downloadFile("https://www.baidu.com/img/superlogo_c4d7df0a003d3db9b65e9ef0fe6da1ec.png", Environment.getExternalStorageDirectory() + File.separator + "test", "baidu")

執(zhí)行結(jié)果:

result.png

后記:如果你是mvp的架構(gòu)在onNext檐嚣,onError或者onComplete中回調(diào)你view中的方法時(shí),請(qǐng)注意要切到主線程中處理observeOn(AndroidSchedulers.mainThread()),不然可能會(huì)報(bào)出異常汁雷,還有就是記得獲取讀寫sd卡的權(quán)限

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末净嘀,一起剝皮案震驚了整個(gè)濱河市报咳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌挖藏,老刑警劉巖暑刃,帶你破解...
    沈念sama閱讀 212,294評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異膜眠,居然都是意外死亡岩臣,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,493評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門宵膨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來架谎,“玉大人,你說我怎么就攤上這事辟躏」瓤郏” “怎么了?”我有些...
    開封第一講書人閱讀 157,790評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵捎琐,是天一觀的道長会涎。 經(jīng)常有香客問我,道長瑞凑,這世上最難降的妖魔是什么末秃? 我笑而不...
    開封第一講書人閱讀 56,595評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮籽御,結(jié)果婚禮上练慕,老公的妹妹穿的比我還像新娘。我一直安慰自己技掏,他們只是感情好铃将,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,718評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著哑梳,像睡著了一般麸塞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上涧衙,一...
    開封第一講書人閱讀 49,906評(píng)論 1 290
  • 那天哪工,我揣著相機(jī)與錄音,去河邊找鬼弧哎。 笑死雁比,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的撤嫩。 我是一名探鬼主播偎捎,決...
    沈念sama閱讀 39,053評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了茴她?” 一聲冷哼從身側(cè)響起寻拂,我...
    開封第一講書人閱讀 37,797評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎丈牢,沒想到半個(gè)月后祭钉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,250評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡己沛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,570評(píng)論 2 327
  • 正文 我和宋清朗相戀三年慌核,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片申尼。...
    茶點(diǎn)故事閱讀 38,711評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡垮卓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出师幕,到底是詐尸還是另有隱情粟按,我是刑警寧澤,帶...
    沈念sama閱讀 34,388評(píng)論 4 332
  • 正文 年R本政府宣布霹粥,位于F島的核電站钾怔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蒙挑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,018評(píng)論 3 316
  • 文/蒙蒙 一愚臀、第九天 我趴在偏房一處隱蔽的房頂上張望忆蚀。 院中可真熱鬧,春花似錦姑裂、人聲如沸馋袜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,796評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽欣鳖。三九已至,卻和暖如春茴厉,著一層夾襖步出監(jiān)牢的瞬間泽台,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,023評(píng)論 1 266
  • 我被黑心中介騙來泰國打工矾缓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留怀酷,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,461評(píng)論 2 360
  • 正文 我出身青樓嗜闻,卻偏偏與公主長得像蜕依,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,595評(píng)論 2 350

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