web-dev-qa-db-ja.com

AndroidでPostExecuteからアクティビティを正しく開始するにはどうすればよいですか?

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()を呼び出すには、FLAG_ACTIVITY_NEW_TASKフラグが必要です。これは本当にあなたが欲しいものですか?*

私は正しいですか?

21
Eugene Shmorgun

ローカルアクティビティのコンテキストではなく、アプリケーションコンテキストで渡す必要があります。つまり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();
43
dhaag23

私は今これを試しました... PostExecuteメソッドで動作します!!!

Intent intent_name = new Intent();
intent_name.setClass(getApplicationContext(),DestinationClassName.class);
startActivity(intent_name);
18
user2162383

ただし、以前のアクティビティから取得した応答(結果)に基づいて新しいインテントを開始する方がよいでしょう。

これにより、エラーインテントが新しいインテントを呼び出す可能性がなくなります。

前のアクティビティが正常に戻るはずだった場合の例...またはWelcomeで新しいインテントを開始できるようにした場合、この方法でチェックアウトできます

  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();
       }

    }
0
eli