2011-06-01 36 views
1

我有一个应用程序,用于从服务器加载图像。因此,我的应用程序导致Outofmemory错误。 我已经发现了这个异常,以防止我的应用程序被强制关闭。但我的应用程序停止在发生异常的地方加载图像。那么有什么办法可以在异常被捕获后重新开始我的活动,这样我的内存就可以释放,活动再次从第一个加载图像。如何在发生异常后重新启动活动

非常需要。任何帮助表示赞赏。

回答

0

突然重新开始当前的活动不会是一个很好的用户体验。 如果可能,请尝试从内存中清除不会向用户显示的图像(以释放它占用的内存)。

如果你仍然要重新启动的电流活动,使用以下命令:

void restartActivity() 
{ 
    CurrentActivity.this.finish(); 
    Intent mIntent = new Intent(CurrentActivity.this, CurrentActivity.class); 
    startActivity(CurrentActivity); 
} 
+0

'从内存中清除图像'我如何实现这一点。这是我真正想要的。我试过system.gc(),bitmap.recycle()。但是我的问题没有解决。你能提出一个想法吗? – 2011-06-01 06:52:47

+0

您可以更具体地了解您是如何在应用程序中实现图像的?如果您使用的是listView,请清除列表中所有图像(通过使用位图= null),除了那些当前显示给用户(即)的内容从第一个可见位置到最后一个可见位置,并在内存不足时调用System。 gc()... – 66CLSjY 2011-06-01 17:15:47

+0

不适用于我:( – SegFault 2013-11-27 16:47:13

0

你不应该捕捉一般的错误和特别是OutOfMemoryError。 OOM之后,你永远无法确定你的应用程序的状态是什么。

相反,您应该考虑改进算法,以避免OOM出现。 描述具体的用例(可能在单独的问题中),有人可以为您提供建议。

+0

你不应该捕捉错误? – 2011-06-01 04:40:05

+0

@ Dr.Dredel从http://java.sun.com/docs/books/jls/second_edition/html/exceptions.doc.html - 第11.5节“类错误及其子类是普通程序通常不是普通程序的例外预计恢复'。所以是的 - 在大多数情况下,即使技术上可行,你也不应该犯错误。 OOM错误是最糟糕的之一,因为它使系统处于不可预测的状态。 – 2011-06-01 04:54:58

0

您可以使用一个未知的异常处理程序,当你的应用程序崩溃时的通知,从那里,你可以重新载入您的活动。 但它非常重要的你确保这种情况发生的次数只有你看到一只独角兽的次数。最好你解决问题而不是解决问题。

这里是一个链接,这将有助于UEH:How do I obtain crash-data from my Android application?

0

我认为这个问题是从服务器上加载图像,其增加导致应用程序在OutOfMemmory错误的记忆。 你必须避免你的应用程序占用这么大的内存。 YOu可以使用LazyLoading Concept加载图像。

看一看用于sample program here

或看看here also

public class DrawableManager { 
    private final Map<String, Drawable> drawableMap; 

    public DrawableManager() { 
     drawableMap = new HashMap<String, Drawable>(); 
    } 

    public Drawable fetchDrawable(String urlString) { 
     if (drawableMap.containsKey(urlString)) { 
      return drawableMap.get(urlString); 
     } 

     Log.d(this.getClass().getSimpleName(), "image url:" + urlString); 
     try { 
      InputStream is = fetch(urlString); 
      Drawable drawable = Drawable.createFromStream(is, "src"); 
      drawableMap.put(urlString, drawable); 
      Log.d(this.getClass().getSimpleName(), "got a thumbnail drawable: " + drawable.getBounds() + ", " 
        + drawable.getIntrinsicHeight() + "," + drawable.getIntrinsicWidth() + ", " 
        + drawable.getMinimumHeight() + "," + drawable.getMinimumWidth()); 
      return drawable; 
     } catch (MalformedURLException e) { 
      Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e); 
      return null; 
     } catch (IOException e) { 
      Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e); 
      return null; 
     } 
    } 

    public void fetchDrawableOnThread(final String urlString, final ImageView imageView) { 
     if (drawableMap.containsKey(urlString)) { 
      imageView.setImageDrawable(drawableMap.get(urlString)); 
     } 

     final Handler handler = new Handler() { 
      @Override 
      public void handleMessage(Message message) { 
       imageView.setImageDrawable((Drawable) message.obj); 
      } 
     }; 

     Thread thread = new Thread() { 
      @Override 
      public void run() { 
       //TODO : set imageView to a "pending" image 
       Drawable drawable = fetchDrawable(urlString); 
       Message message = handler.obtainMessage(1, drawable); 
       handler.sendMessage(message); 
      } 
     }; 
     thread.start(); 
    } 

    private InputStream fetch(String urlString) throws MalformedURLException, IOException { 
     DefaultHttpClient httpClient = new DefaultHttpClient(); 
     HttpGet request = new HttpGet(urlString); 
     HttpResponse response = httpClient.execute(request); 
     return response.getEntity().getContent(); 
    } 

} 

感谢 迪帕克

0
Intent intent = getIntent(); 
overridePendingTransition(0, 0); 
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); 
finish(); 
overridePendingTransition(0, 0); 
startActivity(intent); 

这将刷新或重新启动活动。

相关问题