Cordova下载文件,监听进度,退出疯狂报错

Cordova下载文件,监听进度,退出疯狂报错,第1张

概述如题。报错如下:W/cr_AwContents:ApplicationattemptedtocallonadestroyedWebViewjava.lang.Throwableatorg.chromium.android_webview.AwContents.isDestroyed(AwContents.java:1215)atorg.chromium.android_webview.AwContents.eval

  如题。

  报错如下:

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下载文件,监听进度,退出疯狂报错所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1051800.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存