【发布时间】:2014-09-18 01:01:56
【问题描述】:
如果这是重复的问题,我很抱歉,我搜索了 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 以在用户选择 Naviagtion Drawer(Android Navigation Drawer 模板)中的片段时显示其内容,如下所示
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 中设置了关注选项
android:largeHeap="true"
当我从 FrameLayout 注释 addView() 和 removeView() 操作时,没有内存泄漏。我也尝试对 WebView RAPINaviApplication 使用 WeakReference,但问题仍然存在。如果有人知道这个问题的根源并给我解决方案,我真的很感激。
【问题讨论】:
标签: android android-fragments memory-leaks webview