如何在发生异常后重新启动活动

时间:2011-06-01 04:30:39

标签: android exception-handling out-of-memory

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

急需。任何帮助表示赞赏。

5 个答案:

答案 0 :(得分:0)

一般情况下你不应该捕捉错误,特别是OutOfMemoryError。 在OOM之后,您永远无法确定应用程序的状态。

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

答案 1 :(得分:0)

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

如果您仍想重新启动当前活动,请使用以下命令:

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

我认为问题在于从服务器加载图像,这会增加内存,导致应用程序出现OutOfMemmory错误。 你必须避免你的应用程序占用如此巨大的内存。你可以使用 LazyLoading 概念加载图片。

查看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();
    }

}

由于 迪帕克

答案 4 :(得分:0)

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

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