断点续传

来源:互联网 发布:java招聘 编辑:程序博客网 时间:2024/06/06 16:44

net包
DownloadThread类

package com.example.rxretrofitok.net;import android.util.Log;import com.example.rxretrofitok.utils.DialogUtils;import java.io.BufferedInputStream;import java.io.File;import java.io.IOException;import java.io.RandomAccessFile;import okhttp3.ResponseBody;import retrofit2.Call;import retrofit2.Callback;public class DownloadThread extends Thread{    private String downloadUrl = "";    private String path;    private int threadNum = 5;    public DownloadThread(String downloadUrl, String path) {        this.downloadUrl = downloadUrl;        this.path = path;    }    @Override    public void run() {//        int len = NetUtils.getFileLength(downloadUrl);        RetrofitUtils.download().getFileLenght(downloadUrl).enqueue(new Callback<ResponseBody>() {            @Override            public void onResponse(Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) {                String length = response.headers().get("Content-Length");                downloadTask(Long.valueOf(length));            }            @Override            public void onFailure(Call<ResponseBody> call, Throwable t) {            }        });    }    public void downloadTask(long length){        final File file = new File(path);        if(!file.exists()){            try {                file.createNewFile();            } catch (IOException e) {                e.printStackTrace();            }        }        DialogUtils.MAX_SIZE = length;        //例如  1000kb  3   333        long blockSize = length/threadNum;//        //四舍五入---  让一个数字+0。5在四舍五入 就变成 向上取整//        int blockSize = (int) Math.round(tempSize + 0.5);        //计算出下载块以后   创建线程执行下载操作        for (int i = 0; i < threadNum; i++) {            //计算开始位置            final long startPosition = blockSize * i;            //让最后一个线程下载的大小是正好的,  总长度 - 除了最后一个块的大小和            if(i == threadNum - 1){                blockSize = length - blockSize * (threadNum - 1);            }//            new DownloadTask(downloadUrl, path, blockSize, startPosition).start();            //"Range:bytes=0-100"            String range = "bytes=" + startPosition + "-" + (startPosition + blockSize - 1);            //对于retrofit的网络请求  需要  请求地址 需要设置请求头Range            RetrofitUtils.download().downloadFile(downloadUrl, range).enqueue(new Callback<ResponseBody>() {                @Override                public void onResponse(Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) {                    if(response.isSuccessful()){                        try {                            BufferedInputStream bis = new BufferedInputStream(response.body().byteStream());                            RandomAccessFile raf = new RandomAccessFile(file, "rwd");                            raf.seek(startPosition);                            byte[] buff = new byte[1024*8];                            int len = 0;                            while((len = bis.read(buff)) != -1){                                raf.write(buff, 0 , len);                            }                        } catch (IOException e) {                            e.printStackTrace();                        }                    }else{                        Log.i("=====onResponse=====", "onResponse: " + "失败");                    }                }                @Override                public void onFailure(Call<ResponseBody> call, Throwable t) {                }            });        }    }    public void setThreadNum(int threadNum){        this.threadNum = threadNum;    }}

RequestApi接口

package com.example.rxretrofitok.net;import com.example.rxretrofitok.bean.MessageBean;import okhttp3.ResponseBody;import retrofit2.Call;import retrofit2.http.GET;import retrofit2.http.Header;import retrofit2.http.POST;import retrofit2.http.Path;import retrofit2.http.Streaming;import rx.Observable;public interface RequestApi {    public static final String BASE_URL = "http://169.254.140.132:8080/";    @GET("aaa/code.json")    Observable<MessageBean> getData();    @Streaming    @POST("{fileName}")    Call<ResponseBody> downloadFile(@Path("fileName") String fileName, @Header("Range") String range);    @Streaming    @POST("{fileName}")    Call<ResponseBody> getFileLenght(@Path("fileName") String fileName);}

RetrofitUtils类

package com.example.rxretrofitok.net;import com.example.rxretrofitok.MyInterceptro;import java.util.concurrent.TimeUnit;import okhttp3.OkHttpClient;import retrofit2.Retrofit;import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;import retrofit2.converter.gson.GsonConverterFactory;public class RetrofitUtils {    public static RequestApi doHttpDeal(){        OkHttpClient client = new OkHttpClient.Builder()                .connectTimeout(5, TimeUnit.SECONDS)                .readTimeout(5, TimeUnit.SECONDS)//                .addNetworkInterceptor(new MyInterceptro())                .build();        Retrofit retrofit = new Retrofit.Builder()                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())                .addConverterFactory(GsonConverterFactory.create())                .client(client)                .baseUrl(RequestApi.BASE_URL)                .build();        RequestApi api = retrofit.create(RequestApi.class);        return api;    }    public static RequestApi download(){        OkHttpClient client = new OkHttpClient.Builder()                .connectTimeout(5, TimeUnit.SECONDS)                .readTimeout(5, TimeUnit.SECONDS)                .addNetworkInterceptor(new MyInterceptro())                .build();        Retrofit retrofit = new Retrofit.Builder()                .client(client)                .baseUrl("http://10.0.2.2:8080/aaa/")                .build();        RequestApi api = retrofit.create(RequestApi.class);        return api;    }}

Utiles包
DialogUtils类

package com.example.rxretrofitok.utils;import android.app.ProgressDialog;import android.content.Context;import android.content.DialogInterface;import android.os.AsyncTask;import android.os.SystemClock;import android.support.v7.app.AlertDialog;import com.example.rxretrofitok.net.DownloadThread;public class DialogUtils {    public static long MAX_SIZE = 0;    public static long PROGRESS = -2;    public static void showUpdataDialog(final Context context){        AlertDialog.Builder builder = new AlertDialog.Builder(context);        builder.setTitle("是否更新")                .setMessage("太旧了,更新吧")                .setNegativeButton("就不", null)                .setPositiveButton("可以", new DialogInterface.OnClickListener() {                    @Override                    public void onClick(DialogInterface dialogInterface, int i) {                        new DownloadThread("aaa.json", context.getCacheDir() + "/c.json").start();//                        showProgress(context);                    }                }).show();    }    public static void showProgress(final Context context){        final ProgressDialog pd = new ProgressDialog(context);        pd.setTitle("正在更新");        pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);        pd.setMax(100);        pd.show();        new AsyncTask<String, Integer, String>(){            @Override            protected String doInBackground(String... strings) {                while (PROGRESS + 1 < MAX_SIZE){                    SystemClock.sleep(100);                    if(MAX_SIZE > 0){                        publishProgress((int)(PROGRESS * 100 / MAX_SIZE));                    }                }                return null;            }            @Override            protected void onPostExecute(String s) {                super.onPostExecute(s);                pd.dismiss();            }            @Override            protected void onProgressUpdate(Integer... values) {                super.onProgressUpdate(values);                pd.setProgress(values[0]);            }        }.execute();    }}

MyInterceptro接口

package com.example.rxretrofitok;import android.util.Log;import java.io.IOException;import okhttp3.Interceptor;import okhttp3.Request;import okhttp3.Response;public class MyInterceptro implements Interceptor{    @Override    public Response intercept(Chain chain) throws IOException {        Request request = chain.request();        Log.i("===url===", "intercept: " + request.url());        Log.i("===req-headers===", "intercept: " + request.headers());        Response res = chain.proceed(request);        Log.i("===res-headers===", "intercept: " + res.headers());//        Log.i("===body===", "intercept: " + res.body().string());        return res;    }}

MainActivity

package com.example.rxretrofitok;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import com.example.rxretrofitok.utils.DialogUtils;/** * 1、导入依赖 * 2、权限 * 3、封装Retrofit + okHttp * 4、写请求接口 * 5、使用 */public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);//        RetrofitUtils.doHttpDeal().getData()//                .subscribeOn(Schedulers.io())//                .observeOn(AndroidSchedulers.mainThread())//                .subscribe(new Observer<MessageBean>() {//            @Override//            public void onCompleted() {//                Log.i("==========", "onCompleted: ");//            }////            @Override//            public void onError(Throwable e) {//                Log.i("==========", "onError: " + e.toString());//            }////            @Override//            public void onNext(MessageBean messageBean) {//                Log.i("==========", "onNext: " + messageBean);//            }//        });        DialogUtils.showUpdataDialog(this);    }}

MessageBean 类 模拟数据 可替换成真实数据

package com.example.rxretrofitok.bean;public class MessageBean {    String msg;    int code;//    T data;}
原创粉丝点击