断点续传
来源:互联网 发布: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;}
阅读全文
0 0
- 断点续传
- 断点续传
- 断点续传
- 断点续传
- 断点续传
- 断点续传
- 断点续传
- 断点续传
- 断点续传
- 断点续传
- 断点续传
- 断点续传
- 断点续传
- 断点续传
- 断点续传
- 断点续传
- 断点续传
- 断点续传
- 访问权限控制
- Oracle 11g R2静默安装安装
- 跨浏览器拖动HTML元素
- Object方法
- 使用JdbcTemplate.queryForObject 的注意点
- 断点续传
- jar包制作
- DOM取消事件默认行为应用
- C/S架构的简单文件传输系统的实现
- Python格式化输出 %s %d %f
- HTML5的Web存储应用
- MySQL存储过程(1)--简介
- 彻底解决Ubuntu下qt creator无法显示中文问题
- ionic2中实现 IndexedDB