如题。
报错如下:
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.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下载文件,监听进度,退出疯狂报错全部内容,希望文章能够帮你解决Cordova下载文件,监听进度,退出疯狂报错所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)