Как правильно запустить активность из PostExecute в Android?

android android-activity android-asynctask

34964 просмотра

3 ответа

972 Репутация автора

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

В PostExecute я заполняю этот список и готовлю его к переносу в новое действие.

Я делаю это так:

@Override
protected void onPostExecute(List<VideoDataDescription> result) 
{
    super.onPostExecute(result);
    MainActivity.progressDialog.dismiss();

    context.startActivity(new Intent(context, ResultsQueryActivity.class));


}

где контекст

    private Context context;

В LogCat после выполнения этого кода я получаю исключение Java.lang.NullPointerException. Возможно ли и правильно ли начинать действие так, как я это делаю?

UPD я добавил

    private Context mContext;


public YoutubeAndYahooParser(Context context) 
{
    super();
    this.mContext = context;
}

инициализировать контекст и вызвать

YoutubeAndYahooParser youtubeAndYahooParser = new YoutubeAndYahooParser(ResultsQueryActivity.this);
                    youtubeAndYahooParser.execute("my string to pass in asynctak");

После этого в PostExecute

Intent intent = new Intent(mContext, ResultsQueryActivity.class);
 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 mContext.startActivity(intent);    

Я добавил новый флаг, потому что я получил в LogCat следующее:

* Для вызова startActivity () вне контекста Activity требуется флаг FLAG_ACTIVITY_NEW_TASK. Это действительно то, что вы хотите? *

Я прав?

Автор: Eugene Shmorgun Источник Размещён: 02.02.2012 06:41

Ответы (3)


43 плюса

5749 Репутация автора

Решение

Вы должны передать контекст приложения, а не контекст локальной активности. Т.е. используйте context.getApplicationContext () и сохраните его в локальной переменной в своем подклассе AsyncTask.

Код может выглядеть примерно так:

public class MyAsyncTask extends AsyncTask {

    Context context;
    private MyAsyncTask(Context context) {
        this.context = context.getApplicationContext();
    }

    @Override
    protected Object doInBackground(Object... params) {
        ...
    }

    @Override
    protected void onPostExecute(List<VideoDataDescription> result) {
        super.onPostExecute(result);
        MainActivity.progressDialog.dismiss();

        context.startActivity(new Intent(context, ResultsQueryActivity.class));
    }
}

Вы бы назвали это так:

   new MyAsyncTask(context).execute();
Автор: dhaag23 Размещён: 02.02.2012 07:03

18 плюса

0 Репутация автора

Я попробовал это только сейчас ... это работает в методе PostExecute !!!

Intent intent_name = new Intent();
intent_name.setClass(getApplicationContext(),DestinationClassName.class);
startActivity(intent_name);
Автор: user2162383 Размещён: 16.03.2013 12:25

0 плюса

3607 Репутация автора

Но лучше, если вы начнете новое намерение на основе ответа (результата), полученного в результате предыдущих действий.

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

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

  protected void onPostExecute(String result) {
       if (result.equals("Succesfully...")){
           context.startActivity(new Intent(context, Login_Activity.class));
           Toast.makeText(context, result, Toast.LENGTH_LONG).show();


       }else  if (result.contains("Welcome")){
           context.startActivity(new Intent(context, MainActivity.class));
       }else {
           Toast.makeText(context,result,Toast.LENGTH_LONG).show();
       }

    }
Автор: eLi Размещён: 26.06.2018 07:39
Вопросы из категории :
32x32