添加和删除WebView从帧布局碎片动态导致内存泄漏(堆增长(碎片的情况下))



我很抱歉,如果这是重复的问题,我谷歌了1天,但仍然没有找到所需的解决方案。因为我想保留WebView的所有状态(javascript环境,显示页面…),我在应用程序类中声明我的WebView如下

public class RAPINaviMainApplication extends Application {
    private WebView mWebView = null;
    private boolean isWebViewInitialized = false;

    @Override
    public void onCreate () {
        super.onCreate();
        mWebView = new WebView(getApplicationContext());
        isWebViewInitialized = false; // we do some initialization once in our activity.
        mWebView.setWebViewClient(new WebViewClient());
        mWebView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        mWebView.getSettings().setJavaScriptEnabled(true);
    }
    public boolean isWebViewInitialized() {
        return isWebViewInitialized;
    }
    public void setWebViewInitialized(boolean initialize) {
        isWebViewInitialized = initialize;
    }
    public WebView getWebView() {
        return mWebView;
    }   
}

然后我在RAPINaviMainFragment中动态添加webview,以便当用户在导航抽屉(Android导航抽屉模板)中选择片段时显示其内容,如下图

public class RAPINaviMainFragment extends Fragment {
    private static final String ARG_SECTION_NUMBER = "section_number";
    private static final String TAG = "RAPINaviMainFragment";
    private FrameLayout mFrameLayout;

    public static RAPINaviMainFragment newInstance(int sectionNumber) {
        RAPINaviMainFragment fragment = new RAPINaviMainFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_SECTION_NUMBER, sectionNumber);
        fragment.setArguments(args);
        return fragment;
    }
    public RAPINaviMainFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_rapinavi_main, container,
                false);
        mFrameLayout = (FrameLayout) rootView.findViewById(R.id.webview_container);

        if (((RAPINaviMainApplication)getActivity().getApplication()).isWebViewInitialized() == false) {
            ((RAPINaviMainApplication)getActivity().getApplication()).getWebView().loadUrl("http://www.google.com");
            ((RAPINaviMainApplication)getActivity().getApplication()).setWebViewInitialized(true);
        }       

        return rootView;
    }
    @Override
    public void onAttach(Activity activity) {
        Log.i(TAG, getClass().getSimpleName() + ":entered onAttach()");
        super.onAttach(activity);
        ((RAPINaviMainActivity) activity).onSectionAttached(getArguments()
                .getInt(ARG_SECTION_NUMBER));
    }

    @Override
    public void onResume() {
        Log.i(TAG, getClass().getSimpleName() + ":entered onResume()");
        super.onResume();
        mFrameLayout.addView(((RAPINaviMainApplication)getActivity().getApplication()).getWebView()); 
    }
    @Override
    public void onPause() {
        Log.i(TAG, getClass().getSimpleName() + ":entered onPause()");
        super.onPause();
        mFrameLayout.removeView(((RAPINaviMainApplication)getActivity().getApplication()).getWebView());
    }
}

问题是,每当用户从其他Fragment切换到RAPINaviMainFragment(通过选择导航抽屉中的项目)或当用户在webview中加载新网站时,我从logcat收到内存泄漏信息

07-26 14:11:31.371: I/dalvikvm-heap(10391): Grow heap (frag case) to 12.937MB for 6317296-byte allocation
07-26 14:11:34.825: I/RAPINaviMainFragment(10391): RAPINaviMainFragment:entered onPause()
07-26 14:11:37.578: I/RAPINaviMainFragment(10391): RAPINaviMainFragment:entered onAttach()
07-26 14:11:37.578: I/RAPINaviMainFragment(10391): RAPINaviMainFragment:entered onResume()
07-26 14:11:37.618: I/dalvikvm-heap(10391): Grow heap (frag case) to 12.936MB for 6317296-byte allocation
07-26 14:12:42.167: I/RAPINaviMainFragment(10391): RAPINaviMainFragment:entered onPause()

我也在AndroidManifest.xml中设置了follow选项

  android:largeHeap="true"

当我从framayout注释addView()和removeView()动作时,没有内存泄漏。我还试图使用WeakReference到WebView RAPINaviApplication,但问题仍然发生。如果有人知道这个问题的根源并给我解决的方法,我将不胜感激。

问题是下面的语句

mWebView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

最新更新