String baseUrl="http://cdn.banmi.com/";
@GET("banmiapp/apk/banmi_330.apk")
@Streaming
Observable<ResponseBody> down();
添加权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET" />
代码
private void retrofit() {
Retrofit retrofit = new Retrofit.Builder().addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.baseUrl(ApiServicer.baseUrl)
.build();
Observable<ResponseBody> down = retrofit.create(ApiServicer.class).down();
down.subscribeOn(Schedulers.io())
//因为要写文件,所以Observer不切换到主线程
.subscribe(new Observer<ResponseBody>() {
private int progrss;
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(ResponseBody responseBody) {
InputStream inputStream = responseBody.byteStream();
long maxx = responseBody.contentLength();
String path = Environment.getExternalStorageDirectory() + File.separator + "banmi_330.apk";
File file = new File(path);
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
try {
FileOutputStream fileOutputStream = new FileOutputStream(file);
byte[] bytes = new byte[1024];
int rendLength = 0;
long currLength = 0;
while ((rendLength = inputStream.read(bytes)) != -1) {
fileOutputStream.write(bytes, 0, rendLength);
currLength += rendLength;
progrss = (int) (currLength * 100 / maxx);
progressBar.setProgress(progrss);
runOnUiThread(new Runnable() {
@Override
public void run() {
Result.setText(progrss+"%");
}
});
// Message message = new Message();
// message.what=0;
// message.obj=progrss;
// handler.sendMessage(message);
}
runOnUiThread(new Runnable() {
@Override
public void run() {
if (progrss == 100) {
Toast.makeText(MainActivity.this, "下载成功", Toast.LENGTH_SHORT).show();
}
}
});
inputStream.close();
fileOutputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}