Android清除webview线程,释放内存,避免OutOfMemoryError

时间:2011-06-20 17:39:36

标签: android multithreading image webview out-of-memory

我正在webview中显示一个相当大的图像,以便可以使用缩放缩放功能和其他查看便利。

第一次正确显示。但是在离开活动并回到它之后,应用程序崩溃了与webview线程相关的OutofMemoryError。

我尝试了几件事来尝试关闭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 个答案:

答案 0 :(得分:3)

好的,所以这个问题的结论是在这些文件大小的情况下无法预先确定或正确清除字符串缓冲区。

在这种情况下,图像作为字符串从服务器中提取,作为字符串操作,最后显示为图像。

无论是显示为ImageView还是Webview,都没关系,一旦字符串缓冲区变满,应用程序就会崩溃(无论我释放多少东西或设置为null,它都不会清除),这是一个加密工作。

但最后只是将图像存储在应用程序的资源文件夹中。

答案 1 :(得分:2)

也许尝试回收位图/图像?

如果这不起作用,我建议重新取样。

Strange out of memory issue while loading an image to a Bitmap object

答案 2 :(得分:0)

有效的方式:

<强> 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>

希望这会对你有所帮助。