0

У меня есть активность в Android, и пользователь запускает некоторую задачу (например, нажатием кнопки), которая может занять некоторое время - скажите что-то между 1 мс и 1 минутой. Это может быть какая-то сетевая операция или вычисления или что-то другое. Я могу использовать Thread или AsyncTask или какой-либо другой инструмент. Я хочу что-то изменить в Activity, когда заканчивается задача, например, показать загруженное изображение или лучший ход шахмат и т. Д. Я должен использовать Handler или какой-то эквивалентный инструмент для запуска основного потока, но он все еще ясен и довольно прост. И вот моя проблема:Android - лучший способ получить первоначальное действие после изменения конфигурации

Каков рекомендуемый способ получить текущий объект Activity (вызвать его метод)? Обратите внимание, что пользователь может ничего не делать во время работы (я хочу получить исходный объект Activity), он также может закрыть клавишу Activity by back (я хочу получить null в этом случае - даже если он снова откроет Activity for the второй раз), он может изменить конфигурацию - например, переключиться с портретного на альбомный (я хочу получить новый - текущий экземпляр Activity).

ответ

-1

Используйте команду startActivityForResult, которая запустит вашу задачу и вернет результат в исходный файл.

Затем вы можете проверить ResultCode и намерение установить, что именно произошло (включая случай, когда пользователь cancelled операции).

Дополнительную информацию можно получить в документации разработчика how to get the result from an activity.

+0

Ну, насколько я знаю, это полезно только для отказа от дочерней активности для родительской деятельности. Не для уведомления из Thread или AsyncTask для Activity. Активность 1 только в моем случае. –

2

Это звучит как работа для невидимого фрагмента с призывом setRetainInstance(true).

В принципе, вы должны переместить всю свою логику задач на специальный фрагмент, который не создает никакой иерархии представлений (его onCreateView должен вернуть null). Фрагмент должен сначала позвонить setRetainInstance(true), например. в конструкторе. Когда вам нужно запустить задачу, вы просто добавляете новый фрагмент. Этот фрагмент порождает задачу thread/async и получает результат. Затем вы можете использовать getActivity в Фрагменте, чтобы получить последний экземпляр активности. Если действие уничтожено из-за того, что пользователь оставил его с помощью обратного ключа, будет вызван onDestroy фрагмента, чтобы вы могли отличить, уничтожена ли деятельность или если она воссоздана сейчас.

Просто будьте осторожны, чтобы не хранить экземпляр Activity где-то во фрагменте, чтобы предотвратить утечку и не добавлять фрагмент дважды случайно.

См. the article on developer.android.com для получения более подробной информации об этом подходе.

+0

Эта ссылка кажется правильной, но мне нужен более консервативный подход (фрагменты к новому), потому что я хочу быть старыми версиями Android. Я уверен, что у моей проблемы было некоторое решение даже в Android 1.5. Вероятно, можно сохранить некоторую ссылку на мою тему в onSaveInstanceState() и восстановить ее в onRestoreInstanceState() и сохранить ссылку на текущую активность в объекте Thread. Но я ищу более простое решение для такой простой и общей проблемы. (И я также не хочу ссылаться на объект Activity - это распространенная причина утечки памяти.) –

+0

Android 1.5? Нет никакой реальной причины, по которой разработчику придется беспокоиться об этом. Вероятно, вы можете рассчитывать на пальцы, которые по-прежнему существуют в мире в мире, которые не сломаны, и, конечно же, никто из них больше не обращается к Google Play Store, поэтому, скорее всего, у них не будет возможности загрузить его. Кроме того, Android в те дни не хватало множества инструментов для выполнения этих задач, которые вы описали. Кроме того, Fragments были со времен Honeycomb, который был выпущен в феврале/2011 году (это более 3,5 лет), но не так уж и новичок. – Budius

+1

Наконец, вы можете использовать 'onRetainNonConfigurationInstance' и' getLastNonConfigurationInstance' для «сохранения» потока, который в настоящее время выполняется, но эти методы были устаревшими на API13 (Honeycomb), и документы непосредственно советуют вам НЕ использовать их. ref: https://developer.android.com/reference/android/app/Activity.html – Budius

0

Если есть только одна активность в вашем приложении, то:

  1. Я полагаю, что если вы используете какие-либо фрагменты, а затем внутри фрагмента вы можете получить свой объект деятельности, используя «getActivity()».

  2. Если вы находитесь внутри своей деятельности, вы можете просто получить доступ к своему объекту активности с помощью этого «объекта».

Надеюсь, это поможет.

+0

, второй вариант - ДЕЙСТВИТЕЛЬНО плохой вариант, который приводит к огромным утечкам памяти. Пожалуйста, не делайте этого, и не предлагайте другим ppl сделать это. – Budius

+0

@Budius Я отредактировал свой ответ. –

+0

Прохладный, «новый» второй вариант в порядке. – Budius

2

Существует несколько разных способов сделать это.

  • как предложено @DarthBeleg, вы можете использовать фрагмент с setRetainInstance(true);, вся логика обработки идет внутри этого фрагмента, активность может findFragmentByTag и фрагмент можно найти активность по getActivity()

  • службы. Услуги велики, у них есть собственный жизненный цикл, они могут продолжать работать, пока деятельность не исчезла. Активность запуск службы прохождения требования задачи по Intent и тогда вы два варианту

    1) активность связывается со службой и использовать некоторые публичные методы для регистрации обратных вызовов, когда задачи завершены, результаты доступны

    2) деятельность onStart/onStop зарегистрировать BroadcastReceiver с LocalBroadcastManager и Службой отправки передач, чтобы уведомлять или передавать информацию о деятельности в любое время, когда она захочет.

  • , если все, что вы делаете загрузку/chaching изображения будет показано на вашей активность UI, просто забыть всю эту поточную и кэширование сложность и использовать Picasso library вы делаете одну строки кода Picasso.with(context).load(url).into(imageView); и библиотеку автомагически ухаживает всего, что вам нужно.

  • есть также Loaders, что Ваша деятельность может подключиться к реализации путем LoaderCallbacks и вызова getLoaderManager().initLoader(0, null, this), и при вращении активность снова повторно подключается к тому же загрузчиком. И результат будет перенесен в текущий текущий экземпляр действия.

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

надеюсь, что это поможет ... счастливое кодирование.

 Смежные вопросы

  • Нет связанных вопросов^_^