2016-12-22 14 views
3

をリーク特定コード:AndroidのWebViewのウィンドウは、私はWebViewのを使用して、私の大きなプロジェクトでは、この問題が発生しているが、私は自分のコードに何かを見つけることができなかったとき、私は2つだけのものが含まれている単純なプロジェクトを作っ

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    WebView webView = (WebView) findViewById(R.id.webView); 
    Uri uri = Uri.parse("android.resource://whatever"); 
    webView.loadUrl(uri.toString()); 
} 

activity_main.xmlのみレイアウトとWebViewのを含んでいます。他に何もない。

今、ウェブビューではウェブサイトを表示できないというメッセージが表示され、問題ありません。それが表示されるかどうかは関係ありません。私がテキストを選択してポップアップが表示されたとき(コピー|貼り付けをして)、[戻る]ボタンをクリックすると(アクティビティを終了します)、次の例外が発生します(クラッシュしません)。

E/Surface: getSlotFromBufferLocked: unknown buffer: 0x7fb64bfadb20 
E/WindowManager: android.view.WindowLeaked: Activity com.example.***.richwebeditor.MainActivity has leaked window android.widget.PopupWindow$PopupDecorView{ffd5bff V.E...... ........ 0,0-116,58} that was originally added here 
     at android.view.ViewRootImpl.<init>(ViewRootImpl.java:368) 
     at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:299) 
     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85) 
     at android.widget.PopupWindow.invokePopup(PopupWindow.java:1258) 
     at android.widget.PopupWindow.showAtLocation(PopupWindow.java:1032) 
     at android.widget.PopupWindow.showAtLocation(PopupWindow.java:995) 
     at org.chromium.content.browser.input.PopupTouchHandleDrawable.show(PopupTouchHandleDrawable.java:354) 
     at org.chromium.android_webview.AwContents.nativeOnDraw(Native Method) 
     at org.chromium.android_webview.AwContents.access$4500(AwContents.java:92) 
     at org.chromium.android_webview.AwContents$AwViewMethodsImpl.onDraw(AwContents.java:2731) 
     at org.chromium.android_webview.AwContents.onDraw(AwContents.java:1191) 
     at com.android.webview.chromium.WebViewChromium.onDraw(WebViewChromium.java:1713) 
     at android.webkit.WebView.onDraw(WebView.java:2486) 
     at android.view.View.draw(View.java:16178) 
     at android.view.View.updateDisplayListIfDirty(View.java:15174) 
     at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593) 
     at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573) 
     at android.view.View.updateDisplayListIfDirty(View.java:15134) 
     at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593) 
     at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573) 
     at android.view.View.updateDisplayListIfDirty(View.java:15134) 
     at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593) 
     at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573) 
     at android.view.View.updateDisplayListIfDirty(View.java:15134) 
     at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593) 
     at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573) 
     at android.view.View.updateDisplayListIfDirty(View.java:15134) 
     at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593) 
     at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573) 
     at android.view.View.updateDisplayListIfDirty(View.java:15134) 
     at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593) 
     at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573) 
     at android.view.View.updateDisplayListIfDirty(View.java:15134) 
     at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:281) 
     at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:287) 
     at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:322) 
     at android.view.ViewRootImpl.draw(ViewRootImpl.java:2615) 
     at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2434) 
     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2067) 
     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107) 
     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6013) 
     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) 
     at android.view.Choreographer.doCallbacks(Choreographer.java:670) 
     at android.view.Choreographer.doFrame(Choreographer.java:606) 
     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:148) 
     at android.app.ActivityThread.main(ActivityThread.java:5417) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

E/Surface: getSlotFromBufferLocked: unknown buffer: 0x7fb63de30880 
E/WindowManager: android.view.WindowLeaked: Activity com.example.***.richwebeditor.MainActivity has leaked window android.widget.PopupWindow$PopupDecorView{7220dcc V.E...... ........ 0,0-116,58} that was originally added here 
     at android.view.ViewRootImpl.<init>(ViewRootImpl.java:368) 
     at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:299) 
     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85) 
     at android.widget.PopupWindow.invokePopup(PopupWindow.java:1258) 
     at android.widget.PopupWindow.showAtLocation(PopupWindow.java:1032) 
     at android.widget.PopupWindow.showAtLocation(PopupWindow.java:995) 
     at org.chromium.content.browser.input.PopupTouchHandleDrawable.show(PopupTouchHandleDrawable.java:354) 
     at org.chromium.android_webview.AwContents.nativeOnDraw(Native Method) 
     at org.chromium.android_webview.AwContents.access$4500(AwContents.java:92) 
     at org.chromium.android_webview.AwContents$AwViewMethodsImpl.onDraw(AwContents.java:2731) 
     at org.chromium.android_webview.AwContents.onDraw(AwContents.java:1191) 
     at com.android.webview.chromium.WebViewChromium.onDraw(WebViewChromium.java:1713) 
     at android.webkit.WebView.onDraw(WebView.java:2486) 
     at android.view.View.draw(View.java:16178) 
     at android.view.View.updateDisplayListIfDirty(View.java:15174) 
     at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593) 
     at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573) 
     at android.view.View.updateDisplayListIfDirty(View.java:15134) 
     at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593) 
     at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573) 
     at android.view.View.updateDisplayListIfDirty(View.java:15134) 
     at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593) 
     at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573) 
     at android.view.View.updateDisplayListIfDirty(View.java:15134) 
     at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593) 
     at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573) 
     at android.view.View.updateDisplayListIfDirty(View.java:15134) 
     at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593) 
     at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573) 
     at android.view.View.updateDisplayListIfDirty(View.java:15134) 
     at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593) 
     at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573) 
     at android.view.View.updateDisplayListIfDirty(View.java:15134) 
     at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:281) 
     at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:287) 
     at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:322) 
     at android.view.ViewRootImpl.draw(ViewRootImpl.java:2615) 
     at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2434) 
     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2067) 
     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107) 
     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6013) 
     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) 
     at android.view.Choreographer.doCallbacks(Choreographer.java:670) 
     at android.view.Choreographer.doFrame(Choreographer.java:606) 
     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:148) 
     at android.app.ActivityThread.main(ActivityThread.java:5417) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
E/Surface: getSlotFromBufferLocked: unknown buffer: 0x7fb63de30340 

は、私は、3つの異なるサムスンギャラクシーデバイス(アンドロイド6.1)、エミュレータ(7.0)と古いHTCの携帯電話(5.0)上でそれをテストしました。私はあらゆる場合に例外があります。

誰でもこの問題が発生しましたか? Android webviewのバグですか?解決策はありますか?

編集:私は話している何ポップアップについての参考のため 画面:

Imgur1

Imgur2

+0

使用中webView.loadUrl("about:blank");を追加しようとし、仕上げの前活動WebViewが使用するリソースを解放する必要があります); ' –

+0

これは私のダイアログではありません。これは、ユーザーがテキストをコピーするために選択するたびに表示されるシステムポップアップです。私はそれにアクセスできない。 – dabu

+0

マニフェストにインターネットアクセス許可を追加しましたか?アプリケーションがネットワークソケットを必要とするならば、あなたのアプリケーションはそれを使うための許可を必要とします。 –

答えて

1

この問題は活動を終えたときに

webView.destroy() 

を呼び出すことであるのは良く回避策のように見えるの前に存在して確認してください。私はこの問題のためのよりよい解決策があると信じて、しばらくの間このスレッドを未解決のままにしておきます。多分それを経験した人がそれを処理する適切な方法を共有するでしょう。

0

あなたがその活動に戻ってあなたのWebビューの使用から、これを移動する場合

@Override 
public void onBackPressed() { 
    if (webView.canGoBack()) { 
     webView.goBack(); 
    } else { 
     super.onBackPressed(); // maybe you can even change this as needed 
    } 
} 

- アクティビティを作成します。

-Spawnそのアクティビティへの参照を持つワーカースレッドを生成します。 - アクティビティは何らかの形で(ユーザーの操作の結果として)クローズ/フィニッシュされ、システムはそのリソースを収集しようとします。

- ワーカースレッドがまだ実行されていて、アクティビティへの参照が保持されているため、潜在的に危険な状態でアプリケーションの状態を変更または破損することなく、アクティビティが「リーク」し、システムが自由にリクレイミングできません。

- アクティビティはAndroidの重量オブジェクトで、システムリソースマネージャーは、ユーザーにスムーズでパフォーマンスの高いエクスペリエンスを提供するために、それらを再利用できる必要があります。したがって、この「リーク」はエラーとみなされます。これらの例-In

は、参照がまだあなたの行動

0

たぶん、あなたはあなたが `dialog.dismiss(あなたの活動と/それで行われたときにアラートため却下onDestroy()

関連する問題

 関連する問題