Activity 已泄露 IntentReceiver - LollipopBrowserAccessibilityManager
Activity has leaked IntentReceiver - LollipopBrowserAccessibilityManager
我希望能在这里找到一些帮助,因为我对 Android 中的 BroadcastReceivers 不熟悉。这段代码打开一个 WebView,将您重定向到登录页面,并在检测到 URL 更改后接收登录令牌。之后,Activity 关闭。
@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@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@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)
我的问题是我不知道必须注销哪个 BroadcastReceiver,因为我还没有创建和初始化一个。
感谢您的帮助
您是否正在使用以下任何一项WebSettings
?
settings.setAllowContentAccess(true);
settings.setAllowFileAccessFromFileURLs(true);
settings.setAllowUniversalAccessFromFileURLs(true);
settings.setAllowFileAccess(true);
我发现通过禁用这些选项(在我的实例中实际上不需要它们),错误消失了。我猜它与其中之一所需的兼容性库有关。
当 WebView 仍附加到其父视图时调用 destroy()
时会出现此问题。
可以通过在调用 destroy()
.
之前先从其父视图中删除 Webview 来解决崩溃问题
请注意,即使您没有手动调用 destroy()
(就像我的情况一样),此崩溃仍然会发生。我发现关键是你必须显式地销毁 WebView(至少在一个片段中),因为 Android 不会为你处理这个,并且在这样做之前,你必须将它从它的父级中删除查看。
例如,如果您有一个 WebView 片段:
@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/
我希望能在这里找到一些帮助,因为我对 Android 中的 BroadcastReceivers 不熟悉。这段代码打开一个 WebView,将您重定向到登录页面,并在检测到 URL 更改后接收登录令牌。之后,Activity 关闭。
@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@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@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)
我的问题是我不知道必须注销哪个 BroadcastReceiver,因为我还没有创建和初始化一个。
感谢您的帮助
您是否正在使用以下任何一项WebSettings
?
settings.setAllowContentAccess(true);
settings.setAllowFileAccessFromFileURLs(true);
settings.setAllowUniversalAccessFromFileURLs(true);
settings.setAllowFileAccess(true);
我发现通过禁用这些选项(在我的实例中实际上不需要它们),错误消失了。我猜它与其中之一所需的兼容性库有关。
当 WebView 仍附加到其父视图时调用 destroy()
时会出现此问题。
可以通过在调用 destroy()
.
请注意,即使您没有手动调用 destroy()
(就像我的情况一样),此崩溃仍然会发生。我发现关键是你必须显式地销毁 WebView(至少在一个片段中),因为 Android 不会为你处理这个,并且在这样做之前,你必须将它从它的父级中删除查看。
例如,如果您有一个 WebView 片段:
@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/