代码之家  ›  专栏  ›  技术社区  ›  Maxim Kopecki

活动已泄漏IntentReceiver-LollipopBrowserAccessibilityManager

  •  11
  • Maxim Kopecki  · 技术社区  · 7 年前

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
    
        mLoginWebView = (WebView) findViewById(R.id.webview_login);
    
        redirectUrl = getString(R.string.app_redirect_url);
    
    
        //RECEIVE PLATFORM ID
        Bundle bundle = getIntent().getExtras();
        if(bundle != null){
            platform = bundle.getInt(ConstantsHelper.LOGIN_EXTRA_TOKEN);
        }
    
        mLoginWebView.setWebViewClient(new WebViewClient() {
    
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
    
                Log.d(TAG, "URL change to to " + url + " was detected");
    
                if (url.contains(redirectUrl) || url.contains("passport.twitch.tv")) {
    
                    Log.d(TAG, "Login with platform " + platform);
    
                    switch (platform){
    
                        //GET INSTAGRAM AUTH TOKEN
                        case ConstantsHelper.ID_INSTAGRAM:{
                            String accessToken = url.split("=")[1];
    
                            SharedPreferenceHelper.putString(ConstantsHelper.PREF_INST_ACCESS_TOKEN, accessToken);
                            NetworkManager.getInstance().catchTokens();
    
                        }
    
                        //GET TWITCH AUTH TOKEN
                        case ConstantsHelper.ID_TWITCH:{
                            String accessToken = url.substring(url.indexOf("=") + 1, url.indexOf("&"));
    
                            SharedPreferenceHelper.putString(ConstantsHelper.PREF_TWITCH_ACCESS_TOKEN, accessToken);
                            NetworkManager.getInstance().catchTokens();
    
                        }
    
                    }
                    finish(); //Activity is closed
                    return true;
                }
                return false;
            }
    
    
        });
    
        switch (platform){
            case 1: mLoginWebView.loadUrl(NetworkManager.getInstance().getInstagramAuthUrl(getApplicationContext()));
            case 4: mLoginWebView.loadUrl(NetworkManager.getInstance().getTwitchAuthUrl(getApplicationContext()));
        }
    
    
    }
    

    什么都没有发生,LogCat显示此错误:

    Activity com.maximutan.socialmedia_feed_merger.activities.LoginActivity has leaked IntentReceiver org.chromium.content.browser.accessibility.LollipopBrowserAccessibilityManager$1@25014a that was originally registered here. Are you missing a call to unregisterReceiver()?
    android.app.IntentReceiverLeaked: Activity com.maximutan.socialmedia_feed_merger.activities.LoginActivity has leaked IntentReceiver org.chromium.content.browser.accessibility.LollipopBrowserAccessibilityManager$1@25014a that was originally registered here. Are you missing a call to unregisterReceiver()?
    at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:962)
    at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:763)
    at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1179)
    at android.app.ContextImpl.registerReceiver(ContextImpl.java:1159)
    at android.app.ContextImpl.registerReceiver(ContextImpl.java:1153)
    at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:554)
    at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:554)
    at org.chromium.content.browser.accessibility.LollipopBrowserAccessibilityManager.<init>(LollipopBrowserAccessibilityManager.java:3)
    at org.chromium.content.browser.accessibility.BrowserAccessibilityManager.create(BrowserAccessibilityManager.java:2)
    at org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method)
    
    at org.chromium.base.SystemMessageHandler.handleMessage(
    SystemMessageHandler.java:7)  
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5527)
    ,at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(
    ZygoteInit.java:730)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)
    

    谢谢你的帮助

    2 回复  |  直到 7 年前
        1
  •  4
  •   Mdlc Aniket Gupte    7 年前

    此问题发生在 destroy()

    崩溃可以通过在调用之前先从其父视图中删除Webview来解决 销毁()

    注意,即使你没有打电话 销毁() 手动(就像我的情况一样)仍然可能发生这种崩溃。我发现关键是你必须明确地破坏一个网络视图(至少在一个片段中),因为Android不能为你处理这个问题,在这样做之前,你必须将它从其父视图中删除。

     @Override
        public void onDestroyView() {
            super.onDestroyView();
    
            // destroy the WebView completely
            if (mWebView != null) {
                // the WebView must be removed from the view hierarchy before calling destroy
                // to prevent a memory leak
                // See https://developer.android.com/reference/android/webkit/WebView.html#destroy%28%29
                ((ViewGroup) mWebView.getParent()).removeView(mWebView);
                mWebView.removeAllViews();
                mWebView.destroy();
                mWebView = null;
            }
        }
    

    完全归功于Billy Brawner: https://brawner.tech/2017/12/03/webview-memory-leak/

        2
  •  -2
  •   RestingRobot    7 年前

    WebSettings ?

        settings.setAllowContentAccess(true);
        settings.setAllowFileAccessFromFileURLs(true);
        settings.setAllowUniversalAccessFromFileURLs(true);
        settings.setAllowFileAccess(true);
    

    我发现通过禁用这些选项(在我的实例中实际上不需要它们),错误消失了。我猜这与其中一个所需的兼容性库有关。