Okhttp上傳文件的進度獲取

下載進度的在之前的文章中實現(xiàn)過:
Android的Splash啟動圖的兩種動態(tài)切換方式

根據(jù)服務(wù)器的數(shù)據(jù)聲明上傳文件的方法

    @Multipart
    @POST("upload")
    Observable<UploadImgBean> uploadHeadPic(@Part MultipartBody.Part files);

借助okhttp的RequestBody我們構(gòu)造一個FileRequestBody繼承RequestBody

public class FileRequestBody extends RequestBody {
    private RequestBody mRequestBody;
    private LoadingListener mLoadingListener;
    private long mContentLength;

    public FileRequestBody(RequestBody requestBody, LoadingListener loadingListener) {
        mRequestBody = requestBody;
        mLoadingListener = loadingListener;
    }

    //文件的總長度
    @Override
    public long contentLength() {
        try {
            if (mContentLength == 0)
                mContentLength = mRequestBody.contentLength();
            return mContentLength;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return -1;
    }

    @Override
    public MediaType contentType() {
        return mRequestBody.contentType();
    }

    @Override
    public void writeTo(BufferedSink sink) throws IOException {
        ByteSink byteSink = new ByteSink(sink);
        BufferedSink mBufferedSink = Okio.buffer(byteSink);
        mRequestBody.writeTo(mBufferedSink);
        mBufferedSink.flush();
    }


    private final class ByteSink extends ForwardingSink {
        //已經(jīng)上傳的長度
        private long mByteLength = 0L;

        ByteSink(Sink delegate) {
            super(delegate);
        }

        @Override
        public void write(Buffer source, long byteCount) throws IOException {
            super.write(source, byteCount);
            mByteLength += byteCount;
            mLoadingListener.onProgress(mByteLength, contentLength());
        }
    }

    public interface LoadingListener {
        void onProgress(long currentLength, long contentLength);
    }
}

實現(xiàn)上傳

RequestBody requestFile =
                RequestBody.create(MediaType.parse("multipart/form-data"), file);
        FileRequestBody fileRequestBody = new FileRequestBody(requestFile, new FileRequestBody.LoadingListener() {
            @Override
            public void onProgress(long currentLength, long contentLength) {
                //獲取上傳的比例
                Log.d("Tag---", currentLength + "/" + contentLength);
            }
        });
        //files是與服務(wù)器對應(yīng)的key
        MultipartBody.Part body =
                MultipartBody.Part.createFormData("files", file.getName(), fileRequestBody);
        RetrofitHelper.userApi().uploadHeadPic(body).subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Action1<UploadImgBean>() {
                    @Override
                    public void call(UploadImgBean uploadImgBean) {
                        //上傳成功
                    }
                }, new Action1<Throwable>() {
                    @Override
                    public void call(Throwable throwable) {
                       //上傳失敗
                    }
                });
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子桐早,更是在濱河造成了極大的恐慌遂蛀,老刑警劉巖撵摆,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伯顶,死亡現(xiàn)場離奇詭異碍粥,居然都是意外死亡鳖眼,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門嚼摩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钦讳,“玉大人矿瘦,你說我怎么就攤上這事≡缸洌” “怎么了缚去?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長琼开。 經(jīng)常有香客問我易结,道長,這世上最難降的妖魔是什么柜候? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任搞动,我火速辦了婚禮,結(jié)果婚禮上改橘,老公的妹妹穿的比我還像新娘滋尉。我一直安慰自己,他們只是感情好飞主,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布狮惜。 她就那樣靜靜地躺著,像睡著了一般碌识。 火紅的嫁衣襯著肌膚如雪碾篡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天筏餐,我揣著相機與錄音开泽,去河邊找鬼。 笑死魁瞪,一個胖子當著我的面吹牛穆律,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播导俘,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼峦耘,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了旅薄?” 一聲冷哼從身側(cè)響起辅髓,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎少梁,沒想到半個月后洛口,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡凯沪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年第焰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妨马。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡挺举,死狀恐怖而叼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情豹悬,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布液荸,位于F島的核電站瞻佛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏娇钱。R本人自食惡果不足惜伤柄,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望文搂。 院中可真熱鬧适刀,春花似錦、人聲如沸煤蹭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽硝皂。三九已至常挚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間稽物,已是汗流浹背奄毡。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留贝或,地道東北人吼过。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像咪奖,于是被迫代替她去往敵國和親盗忱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,264評論 25 707
  • 說在前面 要實現(xiàn)進度的監(jiān)聽赡艰,需要使用到OkHttp的依賴包Okio里的兩個類售淡,一個是Source,一個是Si...
    有沒有口罩給我一個閱讀 5,771評論 8 17
  • 這兩天連續(xù)看了兩篇有關(guān)村上春樹的文章慷垮,一篇是寫如何成為小說家揖闸,一篇寫了他的人生,在此之前料身,只知道村上是個很出名的作...
    hyuk_tt閱讀 192評論 0 0
  • 不要把愛變成傷害 愛情是永遠的主題汤纸,行行色色的人,行行色色的愛情芹血,人們常說愛情是自私的贮泞,的確有道理楞慈。可是...
    遇見美好ZJF閱讀 329評論 2 2
  • 2017/3/24 晚 下班回家的路上突然下雨啃擦,還好我?guī)懔四依叮咧咧吹角懊嬉粋€阿姨拿衣服擋著頭往前走,衣服已經(jīng)...
    薛之謙污哇閱讀 110評論 0 0