асинктическая задача выполняется в onResume после onActivityResult - PullRequest
0 голосов
/ 09 января 2012

Некоторая конкретная ситуация:

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

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

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

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

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

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

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

Код:

Задание A (первое):

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 (). Почему это вызывает проблемы?

Ответы [ 3 ]

0 голосов
/ 09 января 2012

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

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

0 голосов
/ 12 января 2012

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

0 голосов
/ 09 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...