Cordova下载文件,监听进度,退出疯狂报错
如题。
报错如下:
W/cr_AwContents: Application attempted to call on a destroyed WebView
java.lang.Throwable
at org.chromium.android_webview.AwContents.isDestroyed(AwContents.java:1215)
at org.chromium.android_webview.AwContents.evaluateJavaScript(AwContents.java:2200)
at com.android.webview.chromium.WebViewChromium.evaluateJavaScript(WebViewChromium.java:614)
at android.webkit.WebView.evaluateJavascript(WebView.java:1053)
at org.apache.cordova.engine.SystemWebViewEngine.evaluateJavascript(SystemWebViewEngine.java:317)
at org.apache.cordova.NativeToJsMessageQueue$EvalBridgeMode$1.run(NativeToJsMessageQueue.java:378)
at android.os.Handler.handleCallback(Handler.java:755)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6141)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:802)
原因就是下载时使用监听process,始终在native和前端通信,退出应用后,进程还在跑,但前端已经destroy了。修改原生代码!
\platforms\android\app\src\main\java\org\apache\cordova\filetransfer
// 最下面加上强制停止的逻辑
public static volatile boolean aborted = false; @Override
public void onDestroy() {
// abort(objectId);
aborted = true;
new Handler(Looper.getMainLooper()).removeCallbacksAndMessages(null);
super.onDestroy();
}
// 下载读流的过程,手动取消掉
while ((bytesRead = inputStream.read(buffer)) > 0) {
// Log.d("rionnn", String.valueOf(aborted));
if (aborted) {
context.aborted = aborted;
return;
} outputStream.write(buffer, 0, bytesRead);
// Send a progress event.
progress.setLoaded(inputStream.getTotalRawBytesRead());
PluginResult progressResult = new PluginResult(PluginResult.Status.OK, progress.toJSONObject());
progressResult.setKeepCallback(true);
if (aborted) {
return;
} else {
context.sendPluginResult(progressResult);
}
}
这样会有一个问题,回到进程resume的时候,需要重新变成false,否则下载一次返回后,不杀进程重进应用会始终为true,而无法继续下载。但是在CordovaPlugin的onResume方法复写时,调试发现并没有走入这个生命周期... 于是把aborted暴露给MainActivity,复写onResume。
@Override
protected void onResume() {
super.onResume();
FileTransfer.aborted = false;
}
退出时程序挂起的报错解决,不会疯狂输出了。另外还有一些会时不时输出2个的问题,都是和前端通信桥接的问题,细心跟踪源码就能解决... 这些框架确实没有说十全十美的用js来实现原生APP。
Cordova下载文件,监听进度,退出疯狂报错的更多相关文章
- chrome 监听touch类事件报错:无法被动侦听事件preventDefault
先上错误信息: Unable to preventDefault inside passive event listener due to target being treated as passiv ...
- Handler实现线程之间的通信-下载文件动态更新进度条
1. 原理 每一个线程对应一个消息队列MessageQueue,实现线程之间的通信,可通过Handler对象将数据装进Message中,再将消息加入消息队列,而后线程会依次处理消息队列中的消息. 2. ...
- AsyncTask用法解析-下载文件动态更新进度条
1. 泛型 AysncTask<Params, Progress, Result> Params:启动任务时传入的参数,通过调用asyncTask.execute(param)方法传入. ...
- Java:基于MD5的文件监听程序
前述和需求说明 和之前写的 Python:基于MD5的文件监听程序 是同样的功能,就不啰嗦了,就是又写了一个java版本的,可以移步 python 版本去看一下,整个的核心思路是一样的.代码已上传Gi ...
- Python:基于MD5的文件监听程序
前述 写了一个基于MD5算法的文件监听程序,通过不同的文件能够生成不同的哈希函数,来实现实现判断文件夹中的文件的增加.修改.删除和过滤含有特定字符的文件名的文件. 需求说明 需要实现对一个文件夹下的文 ...
- 实现在 .net 中使用 HttpClient 下载文件时显示进度
在 .net framework 中,要实现下载文件并显示进度的话,最简单的做法是使用 WebClient 类.订阅 DownloadProgressChanged 事件就行了. 但是很可惜,WebC ...
- homestead虚拟机,通过npm下载依赖包和解决运行gulp报错问题 yarn出错问题
homestead虚拟机,通过npm下载依赖包和解决运行gulp报错问题 yarn出错问题 1. 在虚拟器运行 npm 下载依赖组件时报错: npm ERR! EPROTO: protocol err ...
- 【报错】spring整合activeMQ,pom.xml文件缺架包,启动报错:Caused by: java.lang.ClassNotFoundException: org.apache.xbean.spring.context.v2.XBeanNamespaceHandler
spring版本:4.3.13 ActiveMq版本:5.15 ======================================================== spring整合act ...
- (未解决)flume监控目录,抓取文件内容推送给kafka,报错
flume监控目录,抓取文件内容推送给kafka,报错: /export/datas/destFile/220104_YT1013_8c5f13f33c299316c6720cc51f94f7a0_2 ...
- Android RxJava2+Retrofit2单文件下载监听进度封装
RxJava2和Retrofit2用的越来越多,最近也在封装一个通用的网络请求库,其中就包括了单文件下载的方法,所以这里进行记录.文末附带Demo 由于网上很多的方法都是使用拦截器进行进度的监听,个人 ...
随机推荐
- 如何通过gRPC传输文件
在gRPC中,可以通过将文件分割成多个小块,然后使用流式RPC将这些小块发送到服务器来传输文件.以下是一个简单的示例,展示了如何在gRPC中实现文件传输. 首先,我们需要定义一个服务来处理文件传输.在 ...
- 强化学习从基础到进阶-常见问题和面试必知必答[6]:演员-评论员算法(advantage actor-critic,A2C),异步A2C、与生成对抗网络的联系等详解
强化学习从基础到进阶-常见问题和面试必知必答[6]:演员-评论员算法(advantage actor-critic,A2C),异步A2C.与生成对抗网络的联系等详解 1.核心词汇 优势演员-评论员(a ...
- C# 静态与动态数组
在C#中,有许多内置的方法可以处理字符和字符串.这些方法是非常有用的,可以帮助开发人员更方便.更高效地处理文本数据.无论是静态数组还是动态数组,都可以使用System.Array类中的各种方法对数组进 ...
- 基于AvaloniaUI开发跨平台.NET三维应用:环境搭建
本文介绍在Vistual Studio 2022中使用Avalonia和集成AnyCAD AvaloniaUI三维控件的的过程. 目录 0 初始化环境 1 创建项目 2 集成AnyCAD Avalon ...
- vue下载本地文件 下载二进制流文件 兼容ie
vue-cli2要下载的静态文件放在static目录下,vue-cli3则放在public目录下 ie不支持 h5 的download写法,故用以下写法 <el-button type=&quo ...
- docker安装oracle数据
docker安装oracle数据库 1️⃣ 通过docker拉取并启动oracle11g(此版本目前主流),docker换源及安装mysql看Springboot创建项目及测试 - $YX$ - 博客 ...
- uni-app+vue3会遇到哪些问题
已经用 uni-app+vue3+ts 开发了一段时间,记录一下日常遇见的问题和解决办法 uni-app 中的单端代码 uni-app 是支持多端,如果你想让你的代码,只在部分平台使用,那么就需要用的 ...
- JS leetcode 拥有最多糖果的孩子 题解分析,六一快乐。
壹 ❀ 引 今天是六一儿童节,leetcode的每日一题也特别可爱,那么今天我们来解决一道与糖果有关的问题,题目来源1431. 拥有最多糖果的孩子,题目描述如下: 给你一个数组 candies 和一个 ...
- NVM Feature— Reservation(NVME 学习笔记五)
8.8 Reservations 预订 NVMe的reservation预订功能,用于让两个或多个主机能够协调配合的访问共享namespace.使用这些功能的协议和方式超出了本规格说明书的范围.对这些 ...
- Java集合框架学习(十四) Iterator接口详解
Iterator接口介绍 public interface Iterator<E> iterator 用于迭代集合类型对象,例如: HashMap, ArrayList, LinkedLi ...