Android очистить поток webview, свободная память, избежать OutOfMemoryError

Я показываю довольно большое изображение в webview, так что функции pinch-to-zoom и другие удобства для просмотра уже доступны.

он отображается правильно в первый раз. Но после выхода из действия и возвращения к нему приложение аварийно завершает работу на OutofMemoryError, связанном с потоком webview.

Я попытался несколько вещей, чтобы попытаться закрыть webview или остановить поток, или очистить его использование памяти, но безрезультатно. Вот примеры код, который я добавил в свою деятельность'onStop() функции

    wv.stopLoading();
    wv.clearCache(true);
    //removeView(wv);
    wv.clearView();
    wv.freeMemory();
    wv.destroy();
    try {
        Class.forName("android.webkit.WebView").getMethod("onPause", (Class[]) null).invoke(wv, (Object[]) null);
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SecurityException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

в любом случае не стесняйтесь критиковать любую из этих строк кода, но дело в том, что они вообще не влияют на ошибку! Это связано с webviewcore самой нити не освобождает память.

это тревожит меня, потому что даже если бы я использовал меньшее изображение, это выглядит так, как будто это все равно произойдет. Помочь?

3 ответов


хорошо, таким образом, вывод к этой проблеме заключался в том, что строковый буфер не может быть предопределен или должным образом очищен при этих размерах файлов.

в этом случае изображение было извлечено из сервера в виде строки, обработано как строка и, наконец, отображено как изображение.

отображается ли как ImageView или как Webview, это не имело значения, приложение будет сбой, как только строковый буфер станет полным (что не будет ясно, независимо от того, сколько вещей я освободил или установил в null), Это была попытка шифрования.

но, наконец, просто решил сохранить изображения в папке активов приложения.


может быть, попробуйте переработать растровое изображение / изображение?

Если это не сработает, я предлагаю повторной выборки.

странная проблема с памятью при загрузке изображения в растровый объект


эффективный способ когда-либо:

WebViewActivity.java

public class WebViewActivity extends AppCompatActivity {

    private WebView mWebView;
    private RelativeLayout mWebViewParent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_web_view);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        mWebViewParent = (RelativeLayout) findViewById(R.id.layoutWebViewParent);
        mWebView = (WebView)findViewById(R.id.webView);

        // Other stuff

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        destroyWebView();
    }

    private void destroyWebView() {
        mWebViewParent.removeAllViews();
        if(mWebView != null) {
            mWebView.clearHistory();
            mWebView.clearCache(true);
            mWebView.loadUrl("about:blank");
            mWebView.freeMemory();
            mWebView.pauseTimers();
            mWebView = null;
        }
        android.os.Process.killProcess(android.os.Process.myPid());
    }
}

activity_web_view.в XML

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/layoutWebViewParent" >

    <WebView
        android:id="@+id/webView"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </WebView>

</RelativeLayout>

AndroidManifest.в XML

<activity
    android:name=".WebViewActivity"
    android:label="@string/title_activity_web_view"
    android:process="webview.kill">
</activity>

надеюсь, это поможет вам.