android斷點下載

斷點下載由于4g比較慢 所以廣泛應(yīng)用,但是出了5g后估計就沒啥用了哈哈
主要就是兩點
第一:添加動態(tài)請求頭 Range:bytes=start-end
范圍 從開始到結(jié)束的位置
第二:就是RandomAccessFile類的使用

下載代碼

  @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        try {

            File directory = Environment.getExternalStorageDirectory();
            final File file = new File(directory, "4567.apk");
            final RandomAccessFile accessFile = new RandomAccessFile(file, "rw");
            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl("https://www.wandoujia.com/")

                    .build();
            RetrofitService retrofitService = retrofit.create(RetrofitService.class);
            String range=String.format("bytes=%d-",file.length());
            Call<ResponseBody> call = retrofitService.breadPointRetrofit(range);
            call.enqueue(new Callback<ResponseBody>() {
                @Override
                public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                    try {
                        ResponseBody body = response.body();
                        InputStream inputStream = body.byteStream();
                        long contentLength = body.contentLength();
                        byte[] bytes = new byte[1024];
                        int len;
                        accessFile.seek(file.length());
                        while ((len=inputStream.read(bytes))!=-1){
                            accessFile.write(bytes,0,len);
                            long length = file.length();
                            int l = (int) (length * 100 / contentLength);
                            Log.i("tag", "onResponse: "+l);
                            if (l == 50) {
                                Log.i("tag", "onResponse: "+"下載一半可以打一次性斷點來實驗");
                            }
                            EventBus.getDefault().post(l);

                        }
                        EventBus.getDefault().post(file);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }

                @Override
                public void onFailure(Call<ResponseBody> call, Throwable t) {

                }
            });

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }


        return super.onStartCommand(intent, flags, startId);
    }

response接口


public interface RetrofitService {

    @GET("https://www.wandoujia.com/apps/604363/download/dot?ch=detail_normal_dl")
    Call<ResponseBody> breadPointRetrofit(@Header("range") String range);
}

下載進度和下載安裝

  @Subscribe(threadMode = ThreadMode.MAIN)
    public void breadPoint(Integer index) {
        progressbar.setProgress(index);
        tv.setText("當前進度:" + index);

    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    private void downloadApp(File file) {
        //        判斷小于7.0版本
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {

            Intent intent = new Intent(Intent.ACTION_VIEW);
            //        7.0版本的uri方法
            Uri uri = Uri.fromFile(file);
            intent.setDataAndType(uri, "application/vnd.android.package-archive");
            startActivityForResult(intent, 2);
        } else {
            Intent intent = new Intent(Intent.ACTION_VIEW);
            //        7.0以上版本用fileprovider
            Uri uri = FileProvider.getUriForFile(this, "com.example.breadpointdownload" + "" +
                    ".provider", file);

            intent.setDataAndType(uri, "application/vnd.android.package-archive");
            intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            startActivityForResult(intent, 2);

        }


    }

fileprovider之前有提過 這里也就不多說它的注冊了

其實上面的代碼有兩個坑 專業(yè)人士可能看出來了有些新手估計還是一臉懵逼狀態(tài) 第一在服務(wù)里retrofit的call請求是主線程工作 所以發(fā)送eventbus的時候雖然刷新ui但是最終結(jié)果還是一下就出了 如果沒有evenbus直接會報錯 第二就是eventbus在view中接收file值的時候用的修飾符錯誤 應(yīng)該是public否則會接收不到值 以下是修改后的代碼

 @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        try {

            File directory = Environment.getExternalStorageDirectory();
            final File file = new File(directory, "4567.apk");
            final RandomAccessFile accessFile = new RandomAccessFile(file, "rw");
            Retrofit retrofit = new Retrofit.Builder().baseUrl("https://www.wandoujia.com/")

                    .build();
            RetrofitService retrofitService = retrofit.create(RetrofitService.class);
            String range = String.format("bytes=%d-", file.length());
            final Call<ResponseBody> call = retrofitService.breadPointRetrofit(range);
//我們在這里開了一個線程池來操作耗時操作
            Executors.newCachedThreadPool().execute(new Runnable() {
                @Override
                public void run() {

                    try {
//查看當前線程名字
                        Log.i("tag", "run: " + Thread.currentThread().getName());
                        Response<ResponseBody> response = call.execute();
                        Log.i("tag", "onResponse: " + Thread.currentThread().getName());
                        ResponseBody body = response.body();
                        InputStream inputStream = body.byteStream();
                        long contentLength = body.contentLength();
                        byte[] bytes = new byte[1024];
                        int len;
                        accessFile.seek(file.length());
                        while ((len = inputStream.read(bytes)) != -1) {
                            accessFile.write(bytes, 0, len);
                            long length = file.length();
                            int l = (int) (length * 100 / contentLength);
                            Log.i("tag", "下載進度: " + l);

                            EventBus.getDefault().post(l);

                        }
                        EventBus.getDefault().post(file);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                }
            });


        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }


        return super.onStartCommand(intent, flags, startId);
    }

view界面的private修飾符改成public就可以了

總結(jié):在使用retrofit或者rxjava的時候一定要注意當前線程是主線程還是子線程!還有就是eventbus傳值的時候方法修飾符一定要public修飾!否則是很難受的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末昂羡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌型檀,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡散址,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門宣赔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來预麸,“玉大人,你說我怎么就攤上這事儒将±艋觯” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵钩蚊,是天一觀的道長贡翘。 經(jīng)常有香客問我,道長砰逻,這世上最難降的妖魔是什么鸣驱? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮蝠咆,結(jié)果婚禮上踊东,老公的妹妹穿的比我還像新娘。我一直安慰自己刚操,他們只是感情好闸翅,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著菊霜,像睡著了一般坚冀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上占卧,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天遗菠,我揣著相機與錄音联喘,去河邊找鬼华蜒。 笑死,一個胖子當著我的面吹牛豁遭,可吹牛的內(nèi)容都是我干的叭喜。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼蓖谢,長吁一口氣:“原來是場噩夢啊……” “哼捂蕴!你這毒婦竟也來了譬涡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤啥辨,失蹤者是張志新(化名)和其女友劉穎涡匀,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體溉知,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡陨瘩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了级乍。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舌劳。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖玫荣,靈堂內(nèi)的尸體忽然破棺而出甚淡,到底是詐尸還是另有隱情,我是刑警寧澤捅厂,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布贯卦,位于F島的核電站,受9級特大地震影響焙贷,放射性物質(zhì)發(fā)生泄漏脸侥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一盈厘、第九天 我趴在偏房一處隱蔽的房頂上張望睁枕。 院中可真熱鬧,春花似錦沸手、人聲如沸外遇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽跳仿。三九已至,卻和暖如春捐晶,著一層夾襖步出監(jiān)牢的瞬間菲语,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工惑灵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留山上,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓英支,卻偏偏與公主長得像佩憾,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

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

  • 一妄帘、斷點下載原理及步驟 對于斷點下載楞黄,就是下載的過程中,都會出現(xiàn)一些異常情況抡驼,導致下載中斷鬼廓。雖說可以重新下載,但是...
    Mr_Dream閱讀 1,143評論 0 2
  • 之前給大家分享了一下關(guān)于斷點下載的基本套路和邏輯下面引入線程池來完成斷點下載!主要就是讓大家更深入的了解一下斷點下...
    Ad大成閱讀 818評論 0 2
  • 前言 斷點續(xù)傳是一個很傳統(tǒng)的話題致盟;現(xiàn)在但凡包含下載功能的軟件桑阶,大部分都會有斷點續(xù)傳的功能;因此對于斷點續(xù)傳的實現(xiàn)勾邦,...
    IAM四十二閱讀 2,263評論 2 5
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,089評論 1 32
  • 在講故事之前眷篇,先讓我科普一下萎河。 咳!…… 十九世紀初,美國展開一場向西部擴張的西進運動蕉饼,一批批冒險家紛紛向太平洋西...
    兔子之書閱讀 244評論 0 1