【问题标题】:Android clear webview thread, free memory, avoid OutOfMemoryErrorAndroid清除webview线程,释放内存,避免OutOfMemoryError
【发布时间】:2011-09-18 21:37:16
【问题描述】:

我在 web 视图中显示了一个相当大的图像,因此捏拉缩放功能和其他查看便利已经可用。

第一次正确显示。但在离开活动并返回活动后,应用程序在与 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 线程本身没有释放内存有关。

这让我很震惊,因为即使我使用的是较小的图像,这看起来最终还是会发生。帮忙?

【问题讨论】:

  • 当你离开活动电话webView.destroy()。您可以通过在您的活动的onDestroy() 中销毁 webview 来做到这一点
  • 没用。 protected void onDestroy(){ super.onDestroy(); wv.destroy(); } 第二次加载活动时仍然出现 OutofMemoryError。
  • hmmm.. 尝试从您的 onStop() 方法中删除代码。并在您致电super.onDestroy()之前尝试销毁您的webview
  • 这也没有影响:(
  • +1 这个清理代码很有帮助

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


【解决方案1】:

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

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

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

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

【讨论】:

  • @Pablo 我在 github 上使用 URLImageViewHelper,我也为该项目做出了贡献
【解决方案2】:

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

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

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

【讨论】:

  • 我将图像作为加密字符串拉下来。不调用位图函数。 webview 正在使用具有正确 mimetype 的 loadData 函数。
  • ReadWriteCharArrayBuffer 没有在第二次分配足够的内存。 (图像以字符串形式出现)我该如何分配... 1024000 的内存
  • 您无法在 Android 设备上分配内存。我记得一些 GoogleIO 会议,其中 Romain Guy 就像“你永远不知道你的应用程序将获得多少内存,所以一直尽可能少地使用”。也就是说,它可能是一个具有巨大解密过程的长字符串?试试finalize() 里面的东西吧?或者在加载 webview 之前调用 System.gc()?
【解决方案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>

希望这会对你有所帮助。

【讨论】:

    猜你喜欢
    • 2014-08-26
    • 2010-12-04
    • 2023-03-23
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多