目錄
前言
記錄開發中遇到的 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,解決這個問題。