Android 開發中遇到的 bug(7)

前言

記錄開發中遇到的 bug,不再讓自己重複地被同樣的 bug 折磨。

正文

1. android.view.WindowLeaked: Activity com.leapsi.sudoku.puzzle.ui.game.GameActivity has leaked window DecorView@5ff69ec[GameActivity] that was originally added here

時間:2019年6月12日19:41:44
錯誤日誌:

2019-06-12 19:39:28.726 12092-12092/com.leapsi.sudoku.puzzle E/WindowManager: android.view.WindowLeaked: Activity com.leapsi.sudoku.puzzle.ui.game.GameActivity has leaked window DecorView@5ff69ec[GameActivity] that was originally added here
        at android.view.ViewRootImpl.<init>(ViewRootImpl.java:620)
        at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:363)
        at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:129)
        at android.app.Dialog.show(Dialog.java:471)
        at com.leapsi.sudoku.puzzle.ui.game.GameActivity.showGameOverDialog(GameActivity.kt:394)
        at com.leapsi.sudoku.puzzle.ui.game.GamePresenter.error(GamePresenter.kt:224)
        at com.leapsi.sudoku.puzzle.ui.game.GameActivity$showPuzzleLoaded$1.invoke(GameActivity.kt:319)
        at com.leapsi.sudoku.puzzle.ui.game.GameActivity$showPuzzleLoaded$1.invoke(GameActivity.kt:38)
        at com.leapsi.sudoku.puzzle.views.PuzzleView.setSelectedTile(PuzzleView.kt:307)
        at com.leapsi.sudoku.puzzle.views.KeyPad$setListeners$1.onClick(KeyPad.kt:40)
        at android.view.View.performClick(View.java:6652)
        at android.view.View.performClickInternal(View.java:6624)
        at android.view.View.access$3100(View.java:787)
        at android.view.View$PerformClick.run(View.java:26213)
        at android.os.Handler.handleCallback(Handler.java:891)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:207)
        at android.app.ActivityThread.main(ActivityThread.java:7470)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:958)

問題分析:在 Activity 裏彈出了 Dialog,先 finish 掉 Activity,再 dismiss Dialog 造成的。
解決辦法:先 dismiss Dialog,再 finish Activity。

2. Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x3040005

時間:2019年6月17日20:03:56
問題描述:

06-17 20:04:13.410 652-652/com.amtb.myapplication E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.amtb.myapplication, PID: 652
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.amtb.myapplication/com.amtb.myapplication.WebViewActivity}: android.view.InflateException: Binary XML file line #11: Error inflating class <unknown>
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2428)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490)
        at android.app.ActivityThread.access$1200(ActivityThread.java:159)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1363)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5569)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:931)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:726)
     Caused by: android.view.InflateException: Binary XML file line #11: Error inflating class <unknown>
        at android.view.LayoutInflater.createView(LayoutInflater.java:652)
        at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:55)
        at com.android.internal.policy.impl.HwPhoneLayoutInflater.onCreateView(HwPhoneLayoutInflater.java:75)
        at android.view.LayoutInflater.onCreateView(LayoutInflater.java:701)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:760)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:825)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:523)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:425)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:368)
        at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:543)
        at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:136)
        at com.amtb.myapplication.WebViewActivity.onCreate(WebViewActivity.java:27)
        at android.app.Activity.performCreate(Activity.java:6078)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1109)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2381)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490) 
        at android.app.ActivityThread.access$1200(ActivityThread.java:159) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1363) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:135) 
        at android.app.ActivityThread.main(ActivityThread.java:5569) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at java.lang.reflect.Method.invoke(Method.java:372) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:931) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:726) 
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Constructor.newInstance(Native Method)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:288)
        at android.view.LayoutInflater.createView(LayoutInflater.java:626)
        at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:55) 
        at com.android.internal.policy.impl.HwPhoneLayoutInflater.onCreateView(HwPhoneLayoutInflater.java:75) 
        at android.view.LayoutInflater.onCreateView(LayoutInflater.java:701) 
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:760) 
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:825) 
        at android.view.LayoutInflater.inflate(LayoutInflater.java:523) 
        at android.view.LayoutInflater.inflate(LayoutInflater.java:425) 
        at android.view.LayoutInflater.inflate(LayoutInflater.java:368) 
        at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:543) 
        at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:136) 
        at com.amtb.myapplication.WebViewActivity.onCreate(WebViewActivity.java:27) 
        at android.app.Activity.performCreate(Activity.java:6078) 
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1109) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2381) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490) 
        at android.app.ActivityThread.access$1200(ActivityThread.java:159) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1363) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:135) 
        at android.app.ActivityThread.main(ActivityThread.java:5569) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at java.lang.reflect.Method.invoke(Method.java:372) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:931) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:726) 
     Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x3040005
        at android.content.res.HwResources.getText(HwResources.java:1299)
        at android.content.res.Resources.getString(Resources.java:398)
        at com.android.org.chromium.content.browser.ContentViewCore.setContainerView(ContentViewCore.java:733)
        at com.android.org.chromium.content.browser.ContentViewCore.initialize(ContentViewCore.java:657)
        at com.android.org.chromium.android_webview.AwContents.createAndInitializeContentViewCore(AwContents.java:649)
        at com.android.org.chromium.android_webview.AwContents.setNewAwContents(AwContents.java:798)
        at com.android.org.chromium.android_webview.AwContents.<init>(AwContents.java:634)
        at com.android.org.chromium.android_webview.AwContents.<init>(AwContents.java:571)
        at com.android.webview.chromium.WebViewChromium.initForReal(WebViewChromium.java:332)
        at com.android.webview.chromium.WebViewChromium.access$100(WebViewChromium.java:102)
        at com.android.webview.chromium.WebViewChromium$1.run(WebViewChromium.java:284)
        at com.android.webview.chromium.WebViewChromium$WebViewChromiumRunQueue.drainQueue(WebViewChromium.java:129)
        at com.android.webview.chromium.WebViewChromium$WebViewChromiumRunQueue$1.run(WebViewChromium.java:116)
        at com.android.org.chromium.base.ThreadUtils.runOnUiThread(ThreadUtils.java:144)
        at com.android.webview.chromium.WebViewChromium$WebViewChromiumRunQueue.addTask(WebViewChromium.java:113)
    	at com.android.webview.chromium.WebViewChromium.init(WebViewChromium.jav

機型:HUAWEI HUAWEI P7-L07(Android5.1.1,API22),OPPO 5.0 API21
解決辦法:
測試了一下,
xml 代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <WebView
            android:id="@+id/webView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
</LinearLayout>

使用 AppCompatActivity(androidx 包下) + webview,報錯;

package com.amtb.myapplication;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.webkit.WebView;

import androidx.appcompat.app.AppCompatActivity;

public class WebViewActivity extends AppCompatActivity {

    private WebView webView;
    public static void start(Context context) {
        Intent starter = new Intent(context, WebViewActivity.class);
        context.startActivity(starter);
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.webview_activity);
        webView = findViewById(R.id.webView);
        webView.loadUrl("https://www.baidu.com");
    }
}

使用 AppCompatActivity(support v7 包的)+ webview,不報錯;

package com.amtb.myapplication;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.webkit.WebView;

public class WebViewActivity extends AppCompatActivity {

    private WebView webView;
    public static void start(Context context) {
        Intent starter = new Intent(context, WebViewActivity.class);
        context.startActivity(starter);
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.webview_activity);
        webView = findViewById(R.id.webView);
        webView.loadUrl("https://www.baidu.com");
    }
}

使用 Activity + webview,不報錯。

package com.amtb.myapplication;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.webkit.WebView;

public class WebViewActivity2 extends Activity {

    private WebView mWebView;

    public static void start(Context context) {
        Intent starter = new Intent(context, WebViewActivity2.class);
        context.startActivity(starter);
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.webview_activity);
        mWebView =  findViewById(R.id.webView);
        mWebView.loadUrl("https://www.baidu.com");
    }
}

從以上驗證可以得出,androidx + webview 在 5.x 手機上會報錯。
所以,在 5.x 時,做了一下兼容,使用 Activity + webview,解決這個問題。

最後

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章