OKHttp實(shí)現(xiàn)帶進(jìn)度的文件上傳济瓢、下載

github地址(完整代碼下載地址)

https://github.com/zhouxu88/OkHttp3_MultiFile.git

一涡贱、簡(jiǎn)介

??????自己對(duì)OKHttp的封裝的對(duì)多文件上傳践付、下載(帶進(jìn)度值)操作的小的框架全封,可實(shí)現(xiàn)如下功能:<ol>
<li>多文件上傳(帶進(jìn)度值)粘室、表單提交到服務(wù)器榄檬;</li>
<li>同時(shí)提交文件、表單數(shù)據(jù)到服務(wù)器</li>
<li>下載文件保存到到本地(帶進(jìn)度值);</li>
<li>可以在文件上傳/下載時(shí)衔统,在開始鹿榜、結(jié)束、進(jìn)度回調(diào)3個(gè)方法中自定義內(nèi)容锦爵。</li>
</ol>

二舱殿、使用步驟

1、Gradle添加如下2個(gè)依賴

allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }

dependencies {
            compile 'com.github.zhouxu88:OkHttp3_MultiFile:v1.0'
    }

2险掀、多文件上傳的調(diào)用

//多文件上傳(帶進(jìn)度)
    private void upload() {
        //這個(gè)是非ui線程回調(diào)沪袭,不可直接操作UI
        final ProgressListener progressListener = new ProgressListener() {
            @Override
            public void onProgress(long bytesWrite, long contentLength, boolean done) {
                Log.i("TAG", "bytesWrite:" + bytesWrite);
                Log.i("TAG", "contentLength" + contentLength);
                Log.i("TAG", (100 * bytesWrite) / contentLength + " % done ");
                Log.i("TAG", "done:" + done);
                Log.i("TAG", "================================");
            }
        };


        //這個(gè)是ui線程回調(diào),可直接操作UI
        UIProgressListener uiProgressRequestListener = new UIProgressListener() {
            @Override
            public void onUIProgress(long bytesWrite, long contentLength, boolean done) {
                Log.i("TAG", "bytesWrite:" + bytesWrite);
                Log.i("TAG", "contentLength" + contentLength);
                Log.i("TAG", (100 * bytesWrite) / contentLength + " % done ");
                Log.i("TAG", "done:" + done);
                Log.i("TAG", "================================");
                //ui層回調(diào),設(shè)置當(dāng)前上傳的進(jìn)度值
                int progress = (int) ((100 * bytesWrite) / contentLength);
                uploadProgress.setProgress(progress);
                uploadTV.setText("上傳進(jìn)度值:" + progress + "%");
            }

            //上傳開始
            @Override
            public void onUIStart(long bytesWrite, long contentLength, boolean done) {
                super.onUIStart(bytesWrite, contentLength, done);
                Toast.makeText(getApplicationContext(),"開始上傳",Toast.LENGTH_SHORT).show();
            }

            //上傳結(jié)束
            @Override
            public void onUIFinish(long bytesWrite, long contentLength, boolean done) {
                super.onUIFinish(bytesWrite, contentLength, done);
                //uploadProgress.setVisibility(View.GONE); //設(shè)置進(jìn)度條不可見
                Toast.makeText(getApplicationContext(),"上傳成功",Toast.LENGTH_SHORT).show();

            }
        };


        //開始Post請(qǐng)求,上傳文件
        OKHttpUtils.doPostRequest(POST_FILE_URL, initUploadFile(), uiProgressRequestListener, new Callback() {
            @Override
            public void onFailure(Call call, final IOException e) {
                Log.i("TAG", "error------> "+e.getMessage());
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(MainActivity.this, "上傳失敗"+e.getMessage(), Toast.LENGTH_SHORT).show();
                    }
                });

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Log.i("TAG", "success---->"+response.body().string());
            }
        });

    }

//初始化上傳文件的數(shù)據(jù)
    private List<String> initUploadFile(){
        List<String> fileNames = new ArrayList<>();
        fileNames.add(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
                + File.separator + "test.txt"); //txt文件
        fileNames.add(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
                + File.separator + "bell.png"); //圖片
        fileNames.add(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES)
                + File.separator + "kobe.mp4"); //視頻
        fileNames.add(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC)
                + File.separator + "xinnian.mp3"); //音樂
        return fileNames;
    }

3樟氢、文件下載的調(diào)用

//文件下載
    private void download() {
        //這個(gè)是非ui線程回調(diào)冈绊,不可直接操作UI
        final ProgressListener progressResponseListener = new ProgressListener() {
            @Override
            public void onProgress(long bytesRead, long contentLength, boolean done) {
                Log.i("TAG", "bytesRead:" + bytesRead);
                Log.i("TAG", "contentLength:" + contentLength);
                Log.i("TAG", "done:" + done);
                if (contentLength != -1) {
                    //長(zhǎng)度未知的情況下回返回-1
                    Log.i("TAG", (100 * bytesRead) / contentLength + "% done");
                }
                Log.i("TAG", "================================");
            }
        };


        //這個(gè)是ui線程回調(diào),可直接操作UI
        final UIProgressListener uiProgressResponseListener = new UIProgressListener() {
            @Override
            public void onUIProgress(long bytesRead, long contentLength, boolean done) {
                Log.i("TAG", "bytesRead:" + bytesRead);
                Log.i("TAG", "contentLength:" + contentLength);
                Log.i("TAG", "done:" + done);
                if (contentLength != -1) {
                    //長(zhǎng)度未知的情況下回返回-1
                    Log.i("TAG", (100 * bytesRead) / contentLength + "% done");
                }
                Log.i("TAG", "================================");
                //ui層回調(diào),設(shè)置下載進(jìn)度
                int progress = (int) ((100 * bytesRead) / contentLength);
                downloadProgress.setProgress(progress);
                downloadTv.setText("下載進(jìn)度:" + progress +"%");
            }

            @Override
            public void onUIStart(long bytesRead, long contentLength, boolean done) {
                super.onUIStart(bytesRead, contentLength, done);
                Toast.makeText(getApplicationContext(),"開始下載",Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onUIFinish(long bytesRead, long contentLength, boolean done) {
                super.onUIFinish(bytesRead, contentLength, done);
                Toast.makeText(getApplicationContext(),"下載完成",Toast.LENGTH_SHORT).show();
            }
        };

        //開啟文件下載
        OKHttpUtils.downloadAndSaveFile(this,DOWNLOAD_TEST_URL,STORE_DOWNLOAD_FILE_PATH,uiProgressResponseListener);

    }

備注

文件上傳埠啃、下載中的UIProgressListener 實(shí)現(xiàn)的3個(gè)方法onUIProgress()死宣、onUIStart()、onUIFinish()的內(nèi)容都可以根據(jù)項(xiàng)目需求自定義

三碴开、效果圖

文件上傳毅该、下載.PNG
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市叹螟,隨后出現(xiàn)的幾起案子鹃骂,更是在濱河造成了極大的恐慌,老刑警劉巖罢绽,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件畏线,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡良价,警方通過(guò)查閱死者的電腦和手機(jī)寝殴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門蒿叠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蚣常,你說(shuō)我怎么就攤上這事市咽。” “怎么了抵蚊?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵施绎,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我贞绳,道長(zhǎng)谷醉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任冈闭,我火速辦了婚禮俱尼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘萎攒。我一直安慰自己遇八,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布耍休。 她就那樣靜靜地躺著刃永,像睡著了一般。 火紅的嫁衣襯著肌膚如雪羊精。 梳的紋絲不亂的頭發(fā)上揽碘,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音园匹,去河邊找鬼。 笑死劫灶,一個(gè)胖子當(dāng)著我的面吹牛裸违,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播本昏,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼供汛,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了涌穆?” 一聲冷哼從身側(cè)響起怔昨,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎宿稀,沒想到半個(gè)月后趁舀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡祝沸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年矮烹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了越庇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡奉狈,死狀恐怖卤唉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情仁期,我是刑警寧澤桑驱,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站跛蛋,受9級(jí)特大地震影響熬的,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜问芬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一悦析、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧此衅,春花似錦强戴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至墨微,卻和暖如春道媚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背翘县。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工最域, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人锈麸。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓镀脂,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親忘伞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子薄翅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,139評(píng)論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)氓奈,斷路器翘魄,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • 最近很多朋友在辦理信用卡的時(shí)候都會(huì)遇到一個(gè)問(wèn)題:新版的信用卡額度太低了,只能拿來(lái)買菜刷刷卡舀奶,這額度低的根本沒有激活...
    簡(jiǎn)單做事閱讀 306評(píng)論 0 0
  • 近期油價(jià)下跌從某種意義上來(lái)說(shuō)是價(jià)格戰(zhàn)造成的育勺。 什么樣的特性使得價(jià)格戰(zhàn)更容易發(fā)生呢光羞?我認(rèn)為有三個(gè)屬性绩鸣。...
    小小杠桿閱讀 255評(píng)論 1 2
  • 1:APP上傳 項(xiàng)目版本號(hào)是否增加點(diǎn)擊查看圖例 網(wǎng)絡(luò)環(huán)境是否是外網(wǎng)點(diǎn)擊查看圖例 項(xiàng)目版本DEBUG模式是否更改為:...
    鄭州程序員王一閱讀 1,264評(píng)論 0 3