Android очистить ветку веб-просмотра, освободить память, избежать OutOfMemoryError - PullRequest
10 голосов
/ 20 июня 2011

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

Отображается правильно с первого раза. Но после выхода из действия и возврата к нему приложение вылетает при ошибке 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 не освобождает память.

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

Ответы [ 3 ]

3 голосов
/ 27 июня 2011

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

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

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

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

2 голосов
/ 20 июня 2011

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

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

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

0 голосов
/ 16 апреля 2016

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

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>

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

...