美文网首页
RxJava+Retrofit文件下载

RxJava+Retrofit文件下载

作者: 残非 | 来源:发表于2019-09-26 16:02 被阅读0次
image.png

导入依赖

    implementation 'com.squareup.retrofit2:retrofit:2.4.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.4.0' // 必要依赖,解析json字符所用
    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0' // 必要依赖,和Rxjava结合必      须用到,下面会提到
    implementation "io.reactivex.rxjava2:rxjava:2.1.3" // 必要rxjava2依赖
    implementation "io.reactivex.rxjava2:rxandroid:2.0.1" // 必要rxandrroid依赖,切线程时需要用到

文件下载地址

public interface ApiMySerer {
    String Url="https://alissl.ucdl.pp.uc.cn/fs08/2017/05/02/7/";
    @Streaming
    @GET("106_64d3e3f76babc7bce131650c1c21350d.apk")
    Observable<ResponseBody> downloadimage();
} 

xml布局的使用

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_gravity="center"
android:layout_height="match_parent"
tools:context="com.example.lenovo.kao02_zm0814_1.MainActivity">

<ImageView
android:id="@+id/id_main_img"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher_round"/>
<TextView
android:id="@+id/id_main_dizhi"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="下载地址"/>
<Button
android:id="@+id/id_main_button"
android:layout_gravity="center"
android:text="点击下载"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ProgressBar
android:id="@+id/id_main_progressbar"
style="@style/Base.Widget.AppCompat.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:max="100"
android:progress="45"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/id_main_du"
android:text="下载进度45%"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

</LinearLayout>

点击按钮,开始下载文件

@OnClick({R.id.id_main_img, R.id.id_main_button})
public void onClick(View v) {
    switch (v.getId()) {
        default:
            break;
        case R.id.id_main_img:
            break;
        case R.id.id_main_button:
            mIdMainButton.setEnabled(false);
            Intent intent = new Intent(this, MyService.class);
            //启动服务
            this.startService(intent);
            break;
    }
}

启动服务,开始下载文件

public class MyService extends Service {
    private String TAG = "tag";

    public MyService() {
    }
    //使用onStartCommand的方法
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

定义一个类,用来进行server和activiy之间的传值

public class DownloadInfo {
public String message;
public int progress;

public DownloadInfo(String message, int progress) {
    this.message = message;
    this.progress = progress;
}

public DownloadInfo() {
}

}

在onStartCommand的方法里面进行文件下载

public int onStartCommand(Intent intent, int flags, int startId) {
    Retrofit build = new Retrofit.Builder()
            .baseUrl(ApiMySerer.Url)
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .build();
    build.create(ApiMySerer.class)
            .downloadimage()
            .subscribeOn(Schedulers.io())
            .subscribe(new Observer<ResponseBody>() {
                @Override
                public void onSubscribe(Disposable d) {
                    Log.i(TAG, "onSubscribe: 开始下载");
                }

                @Override
                public void onNext(ResponseBody body) {
                    try {
                        //文件大小
                        long contentLength = body.contentLength();
                        //读取文件
                        InputStream inputStream = body.byteStream();


                        //创建一个文件夹
                        File directory = Environment.getExternalStorageDirectory();
                        File file = new File(directory, "0814-1.apk");
                        FileOutputStream outputStream = new FileOutputStream(file);

                        byte[] bytes = new byte[1024];
                        int len=0;
                        DownloadInfo downloadInfo = new DownloadInfo();
                        //循环读取文件的内容,把他放到新的文件目录里面
                        while ((len=inputStream.read(bytes))!= -1){
                            outputStream.write(bytes,0,len);
                            long length = file.length();
                            //获取下载的大小,并把它传给页面
                            int progress= (int) (length*100/contentLength);
                            downloadInfo.progress=progress;
                            Log.i(TAG, "onNext: =====>>"+progress);
                            EventBus.getDefault().post(downloadInfo);
                        }
                        //当下载完成后,利用粘性发送,并安装
                        EventBus.getDefault().postSticky(file);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }

                @Override
                public void onError(Throwable e) {
                    Log.i(TAG, "onError: e=="+e.getMessage());
                }

                @Override
                public void onComplete() {
                    Log.i(TAG, "onComplete: 下载完成");
                }
            });


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

页面获取服务传过来的下载进度

@Subscribe(threadMode = ThreadMode.MAIN)
public void download(DownloadInfo info){
    int progress = info.progress;
    Log.i(TAG, "download: progress==="+progress);
    String text="当前进度:"+progress+" %";
    mIdMainDu.setText(text);
    mIdMainProgressbar.setProgress(progress);
    if (progress==100){
        mIdMainButton.setEnabled(true);
//当文件下载完成后,跳转到安装页面进行安装
        Intent intent = new Intent(this, AnActivity.class);
        startActivity(intent);
    }
}

安装页面进行获取数据进行安装

file = EventBus.getDefault().getStickyEvent(File.class);
download(file);

进行版本判断

public void download(File file){
  if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N){

      Intent intent = new Intent(Intent.ACTION_VIEW);
      Uri uri=Uri.fromFile(file);
      intent.setDataAndType(uri,"application/vnd.android.package-archive");
      this.startActivityForResult(intent,2);
  }else {

      Intent intent = new Intent(Intent.ACTION_VIEW);
      Uri uriFile=FileProvider.getUriForFile(this,"",file);
      intent.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
      intent.setDataAndType(uriFile,"application/vnd.android.package-archive");
      this.startActivityForResult(intent,2);
  }
}

相关文章

  • RxJava+Retrofit文件下载

    导入依赖 文件下载地址 xml布局的使用 点击按钮,开始下载文件 启动服务,开始下载文件 定义一个类,用来进行se...

  • 基于RxJava2+Retrofit2精心打造的Android基

    基于RxJava+Retrofit精心打造的Android基础框架,包含网络、上传、下载、缓存、事件总线、权限管理...

  • rxjava的disposable

    rxjava+retrofit处理网络请求 在使用rxjava+retrofit处理网络请求的时候,一般会采用对观...

  • Rxjava+Retrofit实践大全

    专题Rxjava+Retrofit实践大

  • rxjava 2.x+retrofit 通过动态url保存网络图

    经常需要下载网络上的图片到本地,比如用户头像之类的,这里采用rxjava+retrofit的形式去实现这个功能 H...

  • Android 零碎知识点和技巧

    使用DownloadManager下载文件 下载文件 监听下载结果 文件下载断点续传 1.获取已下载的文件长度. ...

  • js文件下载

    1.文件流下载 根据后台接口文件流下载 调用 2.文件地址下载 根据文件地址下载文件 调用 3.base64流下载...

  • wget下载数据

    下载单个文件 -nc: 继续下载中断的操作 下载目录下面所有文件 下载多个文件:

  • 文件下载

    由于不同的浏览器兼容不同,对于直接a标签下载文件,有的浏览器可以,有的浏览器会直接播放。为了保证下载操作的正确执行...

  • 文件下载

    常见的文件格式: 文件下载HTML 图片文件下载PHP

网友评论

      本文标题:RxJava+Retrofit文件下载

      本文链接:https://www.haomeiwen.com/subject/wjukuctx.html