Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何从应用程序类访问活动中的WebView而不发生内存泄漏?_Android_Android Activity_Memory Leaks_Reference_Static - Fatal编程技术网

Android 如何从应用程序类访问活动中的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

我觉得答案应该是显而易见的,但我找不到。如何在应用程序类的主要活动中引用WebView?使用公共静态变量在活动类中保存对它的引用会导致内存泄漏

当前代码正常工作,但会导致内存泄漏

活动

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发送方/接收方,这篇文章很有用: