2012-01-09 3 views
0

Некоторых конкретных ситуаций:AsyncTask выполнен в onResume после onActivityResult

У меня есть два Activities. FirstActivity загружает данные из сети (~ 100 кб) и может запускать SecondActivity через startActivityForResult(). После получения результата необходимо запустить другой сетевой вызов. Все это прекрасно работает, кроме исполнения. Вот проблема.

Я вызываю AsyncTask от onActivityResult(), или onResume() или onPostResume(). Я ожидаю, что закончится SecondActivity, появится FirstActivity и отобразится ProgressBar с указанием моих загружающих работ. Но вместо этого я вижу следующее:

SecondActivity замерзает, то FirstActivity получает запущен (я вижу в журналах), AsyncTaskFirstActivity срабатывает и получает отображается только когда AsyncTask закончил свою работу!

Это также странно, потому что я использую точно такой же код, когда сначала начинаю FirstActivity, и все работает так, как ожидалось.

Итак, вопрос:

В чем разница между запуском AsyncTask от onCreate() и onActivityResult()? Почему андроид ведет себя так? Это конкретная версия?

Большое спасибо.

Некоторый код:

активность А (первый):

void onCreate() { 
    super.onCreate(); 
    setupUI(); 
    code = 1; 
    launchLoading(code); 
} 


@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    launchLoading(resultCode); 
} 

активность B (второй):

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
      setResult(i); 
      finish(); 
     } 
}); 

UPD:

создать список пользовательские представления (~ 50) в методе onPostExecute(). Почему это вызывает проблемы?

+0

предоставить код вашего класса AsyncTask - ваша проблема, скорее всего, вызвана неправильной реализацией метода onPostExecute (..) ' –

+0

Спасибо за точку. Я нашел одну строку в методе onPostExecute(), вызывающую проблемы. Я собираюсь провести какое-то время. Я уточню вопрос с деталями. –

+0

Обновлено сообщение. –

ответ

0

Спасибо всем. Проблема была найдена в другом месте. В FirstActivity У меня есть список пользовательских представлений. Каждый из них содержит небольшое растровое изображение, но количество этих просмотров близко к 50.Итак, когда вы возвращаетесь к FirstActivity, для каждого из этих представлений вызывается onMeasure(). Это важно сделать так быстро, насколько это возможно. Когда я улучшил этот метод, проблема исчезла.

0

, когда вы возвращаетесь обратно из другой деятельности, он просто возобновляет свою деятельность, не вдаваясь в метод создания(). что вам нужно сделать, это запустить другое действие из вашей активности asyntask, используя startActivityForResult() и переопределить onActivityResult метод в вашей активности asyntask. и в onActivityResult() снова выполните asyntask. Лучше вы это сделаете вместо вызова из asyntask в Onresume, потому что в каком-то другом случае он также войдет в Onresume, например, нажав домашний ключ и снова запустив

0

Оба способа, onPostExecute(..) и onPreExecute(..), выполняются в UI-потоке (что может вызвать зависает), а doInBackground(..) выполняется в отдельном потоке. Рассмотрим перенос длительных операций с onPostExecute(..) на doInBackground(..).

Во всяком случае, вам сложно советовать вам что-либо, не видя ваш класс AsyncTask и код метода launchLoading (resultCode).

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