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。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM