2013-11-13 10 views
1

У меня есть приложение для Android с соответствующим веб-сайтом. У меня есть функция LoginActivity, которая принимает учетные данные пользователя, использует подкласс AsyncTask для проверки их на веб-сайте и, если правильно, хранит их в SharedPreferences для будущего использования.Безопасное обновление сведений о деятельности от AsyncTask

У меня есть функция MainActivity, которая отображает детали пользователя на основе этих значений SharedPreferences.

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

  1. Я мог бы сделать это, передав ссылку на MainActivity к LoginActivity при вызове его, а затем в AsyncTask onPostExecute, вызвать функцию в этом случае MainActivity обновления отображаемых данных. Это, кажется, общий способ сделать это, но я не уверен, что это абсолютно безопасно. Это маловероятно, но что произойдет, если MainActivity будет завершена ОС, пока AsyncTask все еще обрабатывает?

  2. В качестве альтернативы, в этом случае я мог бы просто закончить() MainActivity при запуске LoginActivity и запустить новую MainActivity из onPostExecute, которая отображает обновленные данные. Но у меня могут быть другие действия, в которых происходит взаимодействие с пользователем, в то время как фоновый AsyncTask обновляет данные - в этом случае второй метод не будет работать.

Просто интересно, есть ли лучший способ сделать это, или это первый способ достаточно безопасный?

+0

1. Чтобы завершить работу MainActivity во время обработки AsyncTask, необходимо, чтобы MainActivity «отменил регистрацию» с помощью AsyncTask, а затем, прежде чем задача перейдет к основному действию, она должна проверить, незарегистрированный ' – ByteMe

ответ

2

Я мог бы сделать это, передав ссылку на MainActivity к LoginActivity при вызове его, а затем в AsyncTask onPostExecute, вызвать функцию в этом случае MainActivity обновления отображаемых данных.

Исключительный способ иметь дело с предстоящими мероприятиями - использовать AsyncTaskLoader. Этот подход реализует предложение @ ByteMe об отмене регистрации/регистрации экземпляров активности. К сожалению, его API-программист ... меньше, чем безболезненный. В частности, API написан для экрана, который начинает загружаться сразу же после его открытия. Использование API Loaders на экране, которое начинает загружаться при взаимодействии с пользователем, вполне возможно, но реализация немного неудобна.

Общий альтернативный подход - при использовании только классов библиотеки классов core и support-v4 - использовать IntentService для выполнения фоновой работы и LocalBroadcastManager для доставки результата.

Если вы используете библиотеки с открытым исходным кодом, вы можете посмотреть Otto Bus или RxJava, чтобы доставить событие «завершено».

В качестве альтернативы, в данном случае, я мог бы просто закончить() в MainActivity, когда я начинаю LoginActivity и запустить новый MainActivity из onPostExecute, который будет отображать обновленные данные.

Если я правильно понимаю, MainActivity - ваша деятельность по запуску. Первое, что он делает, это проверить, нужен ли логин, и если да, то он направляет LoginActivity. Если логин не нужен, он отображает данные учетной записи, и если это так, он ждет возвращения LoginActivity.

Это звучит для меня как идеальное место для startActivityForResult(Intent, int). Просто выполните основную деятельность, чтобы запустить операцию входа с кодом запроса. Активность входа может вызвать setResult(int, Intent) с кодом возврата и данными аутентификации. Затем основное действие может реализовать onActivityResult(), чтобы получить возвращаемое значение из активности входа и выполнить все, что нужно сделать.

В качестве дополнительной выгоды вы можете централизовать взаимодействие SharedPreferences в основном действии и полностью исключить его из-за активности входа в систему. Это обеспечивает более низкое сцепление между ними.

Совершенно другой подход, который вы могли бы рассмотреть, заключается в том, чтобы полностью отключить аутентификацию пользователя и полагаться на Google+ Sign-in, чтобы идентифицировать пользователей по их учетной записи Google+. Вы можете сделать то же самое через Facebook. С другой стороны, использование любого из этих (или обоих) полностью освободит вас от ответственности за проверку подлинности и учетных данных безопасным способом. С другой стороны, есть блокировка поставщика, и это может отпугнуть некоторых пользователей.

+0

Отлично, startActivityForResult/onActivityResult - это именно то, что мне нужно, отлично работает. Мне нравится предложение передать данные и централизовать доступ к SharedPrefs, имеет больше смысла. Бесконечно благодарен –

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