Android 如何从应用程序类访问活动中的WebView而不发生内存泄漏?
我觉得答案应该是显而易见的,但我找不到。如何在应用程序类的主要活动中引用WebView?使用公共静态变量在活动类中保存对它的引用会导致内存泄漏 当前代码正常工作,但会导致内存泄漏 活动Android 如何从应用程序类访问活动中的WebView而不发生内存泄漏?,android,android-activity,memory-leaks,reference,static,Android,Android Activity,Memory Leaks,Reference,Static,我觉得答案应该是显而易见的,但我找不到。如何在应用程序类的主要活动中引用WebView?使用公共静态变量在活动类中保存对它的引用会导致内存泄漏 当前代码正常工作,但会导致内存泄漏 活动 public class Core extends AppCompatActivity { public static WebView coreView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCr
public class Core extends AppCompatActivity {
public static WebView coreView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_core);
WebView myWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setDomStorageEnabled(true);
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
myWebView.setWebViewClient(new WebViewClient());
myWebView.setPadding(0,80,0,0);
coreView = myWebView;
}
}
应用
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
Core.coreView.loadUrl("http://www.google.com");
}
编辑:
完整的应用程序类
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
OneSignal.startInit(this)
.inFocusDisplaying(OneSignal.OSInFocusDisplayOption.Notification)
.setNotificationOpenedHandler(new MainNotificationOpenedHandler())
.setNotificationReceivedHandler(new MainNotificationReceivedHandler())
.unsubscribeWhenNotificationsAreDisabled(true)
.init();
OSPermissionSubscriptionState status = OneSignal.getPermissionSubscriptionState();
}
private class MainNotificationOpenedHandler implements OneSignal.NotificationOpenedHandler {
// This fires when a notification is opened by tapping on it.
@Override
public void notificationOpened(OSNotificationOpenResult result) {
OSNotificationAction.ActionType actionType = result.action.type;
JSONObject data = result.notification.payload.additionalData;
String customKey;
Core.coreView.loadUrl(result.notification.payload.launchURL);
}
}
private class MainNotificationReceivedHandler implements OneSignal.NotificationReceivedHandler {
@Override
public void notificationReceived(OSNotification notification) {
JSONObject data = notification.payload.additionalData;
}
}
}
如何在应用程序类的主要活动中引用WebView
你没有。您可以将该代码移动到活动中,或移动到该活动的范围内的某个对象,例如片段
例如,问题中的代码肯定会崩溃,因为在调用应用程序创建时不会设置Core.coreView。一旦在创建任何组件(如活动)之前调用了应用程序的创建,作为流程启动的一部分。关于运行时崩溃,您完全正确,我简化了问题的代码,但Core.coreView.loadUrl;实际上是在事件处理程序中,而不是在应用程序构造函数中。不管怎样,我接受你的观点。所以应用程序代码永远不应该用来修改活动?我试图做的是在用户收到通知时使用OneSignal SDK更改webview url。OneSignal指示通知的初始化/处理程序应位于extends应用程序类中。所以,如果处理程序在应用程序中,如何告诉webview更改url?PS:原始帖子中添加了完整的应用程序类。谢谢你的帮助@dakishimesan:使用事件总线greenrobot的事件总线、LocalBroadcastManager、基于Rx的东西等。。让您的Main Notification OpenedHandler在总线上发布事件。让您的活动注册总线上的事件,并根据需要作出响应。如果操作得当,这将消除内存泄漏,并处理活动被破坏的情况,例如用户导航。好的,这对我来说更有意义,非常感谢。这非常有用,谢谢。供稍后阅读本文的读者参考,我实现了LocalBroadcastManager发送方/接收方,这篇文章很有用: