[ Android ] WebViewのメモリリーク

WebViewを利用していて開閉を繰り返すと、AndroidProfilerでメモリを確認したら、Graphicsの部分が数Mずつ増えていたので対処してみた。

・Android 7.1

・WebViewはレイアウトに定義してFragmentに入れています。

レイアウトは適当に、画面いっぱいにでも。

public class WebFragment extends Fragment {

    private WebView webView;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_web, container, false);

        webView = (WebView)view.findViewById(R.id.webview);
        webView.setWebViewClient(new WebViewClient());  // use client
        webView.clearCache(true);       // none cache
        webView.loadUrl("https://www.google.co.jp/");

        webView.getSettings().setJavaScriptEnabled(true);   // use javascript
        //WebView.setWebContentsDebuggingEnabled(true);       // use debug

        return view;
    }
}

setWebViewClient をすることでアプリ内にブラウザを開く

getSettings().setJavaScriptEnabled(true) をしないとJavascript動きません

setWebContentsDebuggingEnabled(true) でPCのChromeからデバッグできます

・WebViewの処理を明示的にしてみる

@Override
public void onDestroy() {
    super.onDestroy();
    webView.stopLoading();
    webView.setWebChromeClient(null);
    webView.setWebViewClient(null);
    webView.destroy();
    webView = null;
}

これでGraphicsのメモリの増加がましになった気がする。

・他にもFragmentをaddでWebViewのFragmentを表示しているので、閉じるときにremoveするのも必要かも。。

popBackStackで一つ前の画面に戻ります

getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit();
getActivity().getSupportFragmentManager().popBackStack();

※ 上記コードの書き方では、Fragment切替にアニメーションを入れてたらアニメしませんので、removeはonDestroyのとこにいれたほうがいいかも。