Android使用retrofit-rxjava从服务器下载文件

此处demo中下载的是zip文件

1.权限

访问网络权限,sd卡读写权限(Android6.0后读写权限需要动态申请):
AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

需要动态申请读写权限

 if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED ||
                ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
        }
 }

2.retrofit-rxjava实现网络请求

build.gradle中引入依赖库:

dependencies {
    implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
    implementation 'io.reactivex.rxjava2:rxjava:2.x.y'
    implementation 'com.squareup.retrofit2:retrofit:2.4.0'
    implementation 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
}

RetrofitUtils.java

public interface RetrofitUtils {

    @GET("/public.zip")
    Call<ResponseBody> getZipFile();
}

RetrofitDownloadZipFile.java

/**
     * 下载zip文件
     * retrofit
     * rxjava
     * lamda
     * 结合使用
     * @param filePath
     * @param name
     */
    public void DownloadZipFile(String filePath,String name) {

        //网络请求超时
        OkHttpClient client = new OkHttpClient.Builder().
                connectTimeout(10, TimeUnit.SECONDS).
                readTimeout(5, TimeUnit.SECONDS).
                writeTimeout(5, TimeUnit.SECONDS).build();

        Observable.just(baseUrl)
                .map(url ->{
                    Retrofit retrofit = new Retrofit.Builder().baseUrl(url).client(client).build();

                    RetrofitUtils retrofitUtils = retrofit.create(RetrofitUtils.class);
                    Call<ResponseBody> call = retrofitUtils.getZipFile();

                    retrofit2.Response<ResponseBody> response = call.execute();
                    return response.body();
                })
                .subscribeOn(Schedulers.computation())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<ResponseBody>() {
                    @Override
                    public void accept(ResponseBody responseBody) throws Exception {
                        //网络请求成功,读取文件保存到sd卡
                        SaveZipFile(responseBody,filePath,name);
                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {
                        /**
                         * 网络请求失败
                         * 具体可以自己实现
                         */
                    }
                });
    }

保存文件到sd卡

/**
     * 保存文件到sd卡
     * @param zipData
     * @param filePath
     */
    private void SaveZipFile(ResponseBody zipData,String filePath,String name){
        InputStream is = null;
        byte[] buf = new byte[4096];
        int len = 0;
        FileOutputStream fos = null;

        try {

            is = zipData.byteStream();
            long total = zipData.contentLength();
            File file = new File(filePath, CheckFileUtil.getInstance().getNameFromUrl(name));
            fos = new FileOutputStream(file);
            long sum = 0;

            while ((len = is.read(buf)) != -1) {
                fos.write(buf, 0, len);
                sum += len;
                int progress = (int) (sum * 1.0f / total * 100);
                // 下载中,可以自行加入进度条

            }
            fos.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (is != null)
                    is.close();
            } catch (IOException e) {
            }
            try {
                if (fos != null)
                    fos.close();
            } catch (IOException e) {
            }
        }

        /**
         * 下载完成。可以解压
         * 如果是经过加密的zip包,先解密,再解压
         */

    }

以上下载的过程就完成了

3.在保存到sd卡前需要检测文件夹是否存在,不存在则新建

/**
     * 判断文件是否存在
     * @param filePath zip下载到的文件夹路径名称
     * @param zipfileName zip名称
     */
    @SuppressLint("LongLogTag")
    public void fileIsExists(String filePath, String zipfileName) {
        try {
            File downloadFile = new File(filePath);
            if (!downloadFile.exists()) {
                /**
                 * 文件夹不存在
                 * 创建文件夹
                 * 下载文件
                 */
                downloadFile.mkdirs();

                RetrofitDownloadZipFile.getInstance().DownloadZipFile(filePath,zipfileName);//下载文件

            }else if (downloadFile.exists()){
                /**
                 * 文件夹存在
                 * 检测文件是否存在
                 * 若文件存在--->检测版本号--->是否需要更新资源(需要把旧的资源先删掉)
                 * 若文件不存在,则下载资源文件解压,并把压缩包删除
                 */
                File file = new File(filePath,getNameFromUrl(zipfileName));//zip解压后文件夹路径
                if (!file.exists()){
                    //文件不存在,下载文件
                    RetrofitDownloadZipFile.getInstance().DownloadZipFile(filePath,zipfileName);//下载文件


                }else if (file.exists()){

                    /**
                     * 文件存在,可以做显示操作等等
                     * 也可以做资源版本的检测更新
                     */
                }
            }
        }
        catch (Exception e) {
            e.printStackTrace();
            Log.e("HttpDownUtil:fileIsExists",e.getMessage());
        }
    }

    public String getNameFromUrl(String url) {
        return url.substring(url.lastIndexOf("/") + 1);
    }

然后在需要执行下载的地方调用就行了

CheckFileUtil.getInstance().fileIsExists(path,"/test.zip");

整个流程就是:
1.获取权限
2.检测文件夹是否存在。存在(下载),不存在(新建,再下载)
3.retrofit-rxjava网络请求
4.下载完成保存到sd卡

参考:
链接: https://blog.csdn.net/m0_37794706/article/details/88555188?utm_source=app

需要zip解压,加密,解密(AES)的代码可以私聊我!谢谢!
第一次写博客,如有不对的地方,望大神指点!谢谢!!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值