我很抱歉,如果这是重复的问题,我谷歌了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);