zoukankan      html  css  js  c++  java
  • 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了。修改原生代码!

      platformsandroidappsrcmainjavaorgapachecordovafiletransfer

         // 最下面加上强制停止的逻辑
        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。

  • 相关阅读:
    SpringBoot,来实现MySQL读写分离技术
    range范围
    tuple元组
    序列通用操作及可变序列通用操作
    list列表
    数据
    python基础知识
    charm写代码时添加快捷键
    2、添加到项目里 在⚙图标里选择Add Remote...charm初期设置(远程服务器)
    5、优化
  • 原文地址:https://www.cnblogs.com/rion1234567/p/14341051.html
Copyright © 2011-2022 走看看