Как возобновить активность после возникновения исключения

1

У меня есть приложение, где я загружаю изображения с сервера. Из-за этого мое приложение приводит к ошибке Outofmemory. Я поймал исключение, так что теперь мое приложение не может быть закрыто. Но мое приложение перестает загружать изображения в том месте, где произошло исключение. Так что я могу перезапустить свою деятельность после того, как исключение было поймано, так что моя память освобождается и активность загружает изображения с первого раза еще раз.

Очень необходимо. Любая помощь приветствуется.

Теги:
exception-handling
out-of-memory

5 ответов

0
Лучший ответ

Перезапуск текущей активности внезапно не будет отличным пользовательским интерфейсом. Если возможно, попробуйте очистить изображения из памяти, которые не отображаются пользователю (поэтому он освобождает память, которую он занял).

Если вы хотите перезапустить текущую активность, используйте следующее:

void restartActivity()
{
    CurrentActivity.this.finish();
    Intent mIntent = new Intent(CurrentActivity.this, CurrentActivity.class);
    startActivity(CurrentActivity);
}
  • 0
    clearing Images from memory Как мне этого добиться. это то, что я на самом деле ищу. Я пробовал system.gc (), bitmap.recycle (). Но моя проблема не решена. Можете ли вы предложить идею.
  • 0
    Можете ли вы более подробно рассказать о том, как вы реализовали изображения в своем приложении? Если вы используете listView, удалите все изображения (используя bitmap = null) из списка, кроме тех, которые в данный момент показываются пользователю (т. Е.) От первой видимой позиции до последней видимой позиции, когда память заканчивается, а затем вызовите систему. дс () ...
Показать ещё 2 комментария
0
Intent  intent = getIntent();
overridePendingTransition(0, 0);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
finish();
overridePendingTransition(0, 0);
startActivity(intent);

это обновит или перезапустит действие.

0

Я думаю, что проблема заключается в загрузке изображений с сервера, что увеличило память, вызвав приложение в OutOfMemmory Error. Вы должны избегать приложения, чтобы взять такую ​​огромную память. Для загрузки изображений вы можете использовать LazyLoading.

Ищите пример программы здесь

или посмотрите здесь также

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

Вы используете Неизвестный обработчик исключений, чтобы получать уведомление, когда приложение разбилось, оттуда вы можете снова загрузить свою активность. Но это очень важно, вы убедитесь, что это происходит только столько раз, сколько вы видите единорога. Лучше всего решить проблему, а не обойти ее.

Вот ссылка, которая поможет с UEH: Как мне получить данные crash- из моего приложения Android?

0

Вы не должны ловить ошибку вообще и OutOfMemoryError в частности. После OOM вы никогда не можете быть уверены, что такое состояние вашего приложения.

Вместо этого вы должны изучить усовершенствование своего алгоритма, чтобы OOM не возникал. Опишите конкретный вариант использования (может быть в отдельном вопросе), и кто-то может предложить вам совет.

  • 0
    ты не должен ловить ошибки?
  • 0
    @ Dr.Dredel От java.sun.com/docs/books/jls/second_edition/html/… - раздел 11.5 The class Error and its subclasses are exceptions from which ordinary programs are not ordinarily expected to recover . Так что да - в большинстве случаев вы не должны ловить ошибки, даже если это технически возможно. Ошибка OOM является одной из худших, поскольку она оставляет систему в непредсказуемом состоянии.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню