我正在webview中显示一个相当大的图像,以便查看缩放function和其他便利已经可用。
它第一次正确显示。 但是,在离开活动并回到它之后,应用程序在与webview线程相关的OutofMemoryError上崩溃。
我已经尝试了几件事情来尝试closureswebview或停止线程,或清除其使用内存,但无济于事。 以下是我添加到我的活动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线程本身不释放内存。
这令我感到震惊,因为即使我使用较小的图像,这看起来仍然会最终发生。 帮帮我?
好的,所以这个问题的结论是,string缓冲区不能被预定或在这些文件大小下被正确地清除。
在这种情况下,图像是从服务器以string的forms提取的,作为string操作,最后显示为图像。
无论是显示为ImageView还是Webview,都没有关系,一旦string缓冲区变满(即使我释放了多less东西或设置为null),应用程序也会崩溃,这是一种encryption工作。
但最后只是解决了将图像存储在应用程序的资产文件夹。
也许尝试回收位图/图像?
如果这不起作用,我build议重新抽样。
在将图像加载到Bitmap对象时出现内存不足的问题
有效的方式:
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
AndroidManifest.xml中
希望这会帮助你。