【问题标题】:Memory leaks by passing activity to javascriptinterface?通过将活动传递给javascript接口导致内存泄漏?
【发布时间】:2021-07-07 16:53:54
【问题描述】:

主活动:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        WebView webView = findViewById(R.id.webview);
        webView.addJavascriptInterface(new WebAppInterface(this), "Android");

        webView.loadUrl("https://your_website.com");
    }

    public void doSomeStuff() {
        //do some stuff that requires context or activity
    }

}

WebApp接口:

public class WebAppInterface {

    AppCompatActivity a;

    public WebAppInterface(AppCompatActivity a) {
        this.a=a;
    }

    @JavascriptInterface
    public void calculate() {
        a.doSomeStuff();
    }
}

这会导致内存泄漏吗?如果是,实现我想要的最简单的方法是什么(从 WebAppInterface 中调用 doSomeStuff)?

编辑 1:为什么我认为这会导致内存泄漏?因为在 WebAppInterface 中存在对 Activity 的引用,并且一旦 Activity 被销毁,垃圾收集器可能不会删除该引用。

编辑 2:在我看来,WebView 是 MainActivity 的一部分,因此不能比 MainActivity 活得更久。而且 WebAppInterface 也必须是 WebView 的“成员”,因此应该没有内存泄漏,对吧?

【问题讨论】:

    标签: android memory android-activity


    【解决方案1】:

    此特定代码不会导致内存泄漏,只是循环引用(Activity -> WebView -> WebAppInterface -> Activity)。

    您的活动被销毁后,它将不再被操作系统引用,但仍会在循环引用中被引用。

    幸运的是,GC 很聪明,它认识到即使循环中的所有对象都相互引用,但作为一个集群,它们不会被循环之外的类引用,最终会被标记为死亡。

    【讨论】:

      猜你喜欢
      • 2020-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-02
      • 1970-01-01
      • 1970-01-01
      • 2019-06-11
      • 2021-08-02
      相关资源
      最近更新 更多