Как возобновить активность после возникновения исключения - PullRequest
1 голос
/ 01 июня 2011

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

Многое нужно.Любая помощь приветствуется.

Ответы [ 5 ]

0 голосов
/ 16 января 2012
Intent  intent = getIntent();
overridePendingTransition(0, 0);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
finish();
overridePendingTransition(0, 0);
startActivity(intent);

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

0 голосов
/ 01 июня 2011

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

Посмотрите образец программы здесь

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

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 голосов
/ 01 июня 2011

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

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

void restartActivity()
{
    CurrentActivity.this.finish();
    Intent mIntent = new Intent(CurrentActivity.this, CurrentActivity.class);
    startActivity(CurrentActivity);
}
0 голосов
/ 01 июня 2011

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

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

0 голосов
/ 01 июня 2011

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

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

...