【问题标题】:Android Fragment Webview Memory LeakAndroid Fragment Webview 内存泄漏
【发布时间】:2013-10-10 18:51:20
【问题描述】:

我可以使用一些帮助来确定我的代码中有关片段和 web 视图的问题。我尝试在其他线程中实施一些解决方案未成功。我已经测试了相同的片段被替换而没有在内部创建 webview 并且没有泄漏。有任何想法吗?如果没有,任何人都可以提出替代解决方案吗?

这是我的 webview 片段:

public class CustomWebViewFragment extends PageFragment
{

private LinearLayout mWebContainer;
private WebView mWebView;


/**
 * public View onCreateView(LayoutInflater inflater, ViewGroup container,
 * Bundle savedInstanceState)
 */
@SuppressLint("SetJavaScriptEnabled")
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    View v = inflater.inflate(R.layout.fragment_one, container, false);

    //If I comment this line out, there is no memory leak
    mWebView = new WebView(this.getActivity().getApplicationContext()); 

    return v;
}


/**
 * public void onDestroy()
 */
@Override
public void onDestroy()
{
    super.onDestroy();
    if (mWebView != null)
    {
        mWebView.loadUrl("about:blank");
        mWebView.destroy();
        mWebView = null;
    }
}

}

这是我更改片段的方式:

@Override
public void onNavSelected(String page)
{
    if (page != null && !page.equals(""))
    {
        System.gc();
        if (page.equalsIgnoreCase(GlobalConstants.PAGE_1))
        {
            mCurrent = getFragment(); // Creates a new fragment
            getSupportFragmentManager().beginTransaction()
                .replace(R.id.main_fragment, mCurrent).commit();
        }
    }
}

【问题讨论】:

  • 感谢 mWebView.loadUrl("about:blank")。这解决了我的内存泄漏问题!

标签: android memory-leaks webview android-fragments


【解决方案1】:

改变

//If I comment this line out, there is no memory leak
mWebView = new WebView(this.getActivity().getApplicationContext()); 

&

@Override
public void onDestroy()
{
    super.onDestroy();
    if (mWebView != null)
    {
        mWebView.loadUrl("about:blank");
        mWebView.destroy();
        mWebView = null;
    }
}

mWebView = new WebView(getActivity()); 

&

@Override
public void onDestroy()
{
    // null out before the super call
    if (mWebView != null)
    {
        mWebView.loadUrl("about:blank");
        mWebView = null;
    }
    super.onDestroy();
}

【讨论】:

  • 您能否将内存泄漏日志语句添加到您的问题中,这将有助于缩小范围。
  • webview 只是激怒了应用程序中其他地方的泄漏。这是正确销毁 webview 的正确方法。标记为答案。
  • 我认为,您的意思是 onDestroyView(),而不是 onDestroy()。否则仍然可能存在内存泄漏。根据片段生命周期,可能会出现多次调用 onCreateView() 而 onDestroy() 仅调用一次的情况。
  • 我很确定 mem 泄漏是由使用应用程序上下文而不是活动上下文来创建 webview 引起的。这可以通过 xml 布局(或在 java 构造函数中使用活动上下文)轻松避免。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-25
  • 1970-01-01
  • 1970-01-01
  • 2011-07-15
  • 2018-06-28
  • 1970-01-01
  • 2014-04-18
相关资源
最近更新 更多