Удаленный поток веб-браузера Android, свободная память, избегайте OutOfMemoryError

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

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

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

    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 не освобождает память.

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

Ответ 1

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

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

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

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

Ответ 3

Эффективный способ:

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>

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