android webview下载以及断点续传

game.gif

Android部分代码

所有下载线程的信息会存储再hashmap中,但是这个是线程不安全的。不过我们只是用来存一些数据用来返回给前端进度。

 /**
     * 当前下载对象
     * {
     * key: name 线程名
     * value : {
     * key:filelength 文件总大小
     * key:state 文件状态
     * key:haveDownloaded 当前下载量
     * }
     * }
     */
    public Map<String, Plan> planMap = new HashMap<>();

每次请求会创建一个线程进行下载,代码每次写入会有一定的性能损失,可以先缓存部分然后再一次性写入。


/**
     * 下载文件
     *
     * @param uri 下载地址
     * @throws Exception
     */
    @JavascriptInterface
    public void downLoad(String uri) throws Exception {
        Plan verify = planMap.get(getFileName(uri));
        if (verify == null || (!verify.state && verify.haveDownloaded < verify.filelength)) {
            new Thread() {//子线程
                public void run() {
                    try {
                        //获取服务器上文件的大小
                        HttpClient client = new DefaultHttpClient();
                        HttpHead request = new HttpHead(uri);
                        HttpResponse response = client.execute(request);
                        //response  只有响应头  没有响应体
                        if (response.getStatusLine().getStatusCode() == 200) {
                            Header[] headers = response.getHeaders("Content-Length");
                            String value = headers[0].getValue();
                            //文件大小
                            Long filelength = Long.parseLong(value);
                            Log.i("下载文件", "filelength:" + filelength);
                            //在sdcard创建和服务器大小一样的文件
                            String name = getFileName(uri);
                            File file = new File("/data/data/" + mContext.getPackageName() + "/files", name + ".downLoad");
                            if ((file.exists() && file.length() < filelength) || !file.exists()) {
                                //随机访问文件
                                RandomAccessFile raf = new RandomAccessFile(file, "rwd");
                                //修改下载的开始位置   重新下载
                                Long start = file.length();
                                HttpGet httpget = new HttpGet(uri);
                                httpget.addHeader("Range", "bytes=" + start + "-");//添加请求头
                                response = client.execute(httpget);
                                InputStream inputStream = response.getEntity().getContent();
                                //跳转到起始位置
                                raf.seek(start);
                                //把流写入到文件
                                byte[] buffer = new byte[65536];
                                int len = 0;
                                Plan plan = planMap.get(getFileName(uri));
                                if (plan == null)
                                    plan = new Plan();
                                plan.filelength = filelength;
                                plan.haveDownloaded = start;
                                plan.state = true;
                                planMap.put(name, plan);//当前线程数据更新
                                /*更新下载文件列表*/
                                updateFiles();
                                while ((len = inputStream.read(buffer, 0, buffer.length)) != -1 && plan.state) {
                                    //写数据
                                    raf.write(buffer, 0, len);
                                    plan.haveDownloaded += len;//当前下载数
                                    //模拟  看到进度条动的效果
//                                    SystemClock.sleep(50);
                                }
                                httpget.releaseConnection(); 
                                inputStream.close();
                                //关闭
                                raf.close();
                                if (file.length() == filelength) {
                                    file.renameTo(new File("/data/data/" + mContext.getPackageName() + "/files", name));
                                    /*更新下载文件列表*/
                                    updateFiles();
                                }
                                Log.i("下载", name + "下载结束");
                            }
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }

                ;
            }.start();
        }
    }

一个用到的实体类,用来传给前端当前下载的信息


class Plan {
    /**
     * 总大小
     */
    Long filelength;
    /**
     * 代表当前线程状态 true进行中 false 暂停
     */
    Boolean state;
    /**
     * 当前已下载的数据量
     */
    long haveDownloaded;
}

updateFiles这个方法是用来读取当前目录下的文件用的,有getFiles的方法给前端调用,
作用是 重启APP后获取下载记录。
代码就不贴上来了。
所有代码只提供参考思路,拒绝缝合怪

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Android中,WebView默认没有开启文件下载的功能。如果需要实现文件下载的功能,可以通过设置WebView的DownloadListener来实现。具体操作如下: 1. 创建一个自定义的DownloadListener类,实现DownloadListener接口。 2. 在DownloadListener的onDownloadStart方法中,可以获取到下载链接的url、用户代理、内容描述、MIME类型和文件长度等信息。 3. 在onDownloadStart方法中,可以根据需要进行文件下载的处理,例如使用下载管理器进行下载,或者跳转到外部浏览器进行下载。 4. 将自定义的DownloadListener设置给WebView,可以使用setDownloadListener方法。 以下是一个示例代码: ```java webView.setDownloadListener(new DownloadListener() { @Override public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) { // 在这里进行文件下载的处理 // 可以使用下载管理器进行下载,或者跳转到外部浏览器进行下载 // 例如: Uri uri = Uri.parse(url); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent); } }); ``` 通过设置DownloadListener,当用户点击WebView中的下载链接时,就会触发onDownloadStart方法,你可以在这个方法中实现自己的文件下载逻辑。 #### 引用[.reference_title] - *1* [Android WebView使用之文件下载](https://blog.csdn.net/weixin_32578799/article/details/117540115)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Android WebView 无法下载文件的问题](https://blog.csdn.net/qq_33372370/article/details/122156492)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [AndroidWebView 文件下载](https://blog.csdn.net/leyang0910/article/details/131554032)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值