2012-09-06 4 views
1

Вот что я пытаюсь сделать: Когда мое приложение запускается, оно запускает асинхронный вызов, чтобы получить некоторые данные из WebService. Затем я открываю второе действие, которое отображает эти данные. упрощенный код: активность 1:Как безопасно получать доступ к асинхронному контенту?

OnPostExecute() 
{    
for (int i = 0; i < jsonArray.length(); ++i) 
    { JSONObject jsonTrack = jsonTrackArray.getJSONObject(i); 
       JSONObject jsonObject = jsonArray.getJSONObject(i); 
       Content content = new Content(jsonObject.getString("content"), 
       MyApp.contentList.add(Content); 
     } 
} 

Вторая активность:

doSomething (contentList.get(0)); 

Как я могу убедиться, что, когда я пытаюсь получить доступ к contentList (0), что она уже принесла в AsynTask ?

+0

не могли бы вы уточнить: как временно, пока я жду загрузки контента и повторного доступа к нему? –

+0

Подумайте, как вы собираетесь заполнять contentList? Здесь вы находитесь во второй деятельности. Планируете ли вы перенести его из первого занятия или где-нибудь его хранить? Помещение списка в MyApp, вероятно, не подходит. Это требует от вас расширения приложения базового класса, которое не рекомендуется. –

+0

Я уточнил свой вопрос, удалив эту часть, подумав о том, как временно, пока я получаю результат от webservice, был неправильным способом. Вместо этого у меня будет два привязки к службе, которые используют эти данные, а второе действие будет проверять, находятся ли данные здесь или нет при запуске, если это -> вызов функции, которая нуждается в этих данных. Если нет, вещательный прослушиватель вызовет функцию, когда данные будут извлечены. – Teovald

ответ

0

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

scenario 1: 
activity1 starts service then launches activity2. 
Service completes, saves a preference, and broadcasts a success message. 
activity2 receives this and does its thing. 

scenario 2: 
User comes back later to activity2, it's onResume checks a preference flag and knows the data exists, so it does its thing. 
+0

Трансляция кажется ответом, который я действительно искал. Я запускал эту работу, как только было запущено второе действие (ну, точнее, как только оно было привязано к службе, которая выполняет эту работу). Я думаю, что у меня есть несколько хороших идей относительно того, как справиться с этим элегантно. Благодаря ! – Teovald

+0

Отлично, удачи в вашем приложении! Пожалуйста, отметьте как принято, если это помогло :-). – tsmith

0

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

Просто заметили, что вы помещаете его в класс приложения. Не рекомендуется. Я бы сохранил его в другом месте, например SharedPreference или Database.

Если вы хотите немодальный диалог, вы можете использовать виджет прогресса вместо этого. Вы можете поместить это прямо в заголовок из своего списка.

Также обратите внимание на параметр startActivityForResult().

+0

Спасибо за ответ.Почему не рекомендуется хранить эти данные в классе приложений? , похоже, соответствует центральному описанию местоположения ^^. Это не огромный фрагмент данных, просто список из ~ 50 элементов, которые представляют собой 6 полей (строки, int, ничего слишком большого) – Teovald

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