0

パラメータを渡さずに AsyncTask を使用する方法はありますか? 現在、空の文字列を渡していますが、何もしていません:

    DownloadWebPageTask task = new DownloadWebPageTask();
    task.execute(new String[] { "" });

    class DownloadWebPageTask extends AsyncTask<String, Void, String> {
    private final ProgressDialog dialog = new ProgressDialog(MainScreen.this);
     @Override
        protected void onPreExecute() {
            dialog.setMessage("Gathering data for\n"+selectedSportName+".\nPlease wait...");
            dialog.show();
        }


    @Override
    protected String doInBackground(String... urls) {
        //go do something
        return "";
    }



    @Override
    protected void onPostExecute(String result) {
      dialog.dismiss();
      startTabbedViewActivity();
    }
}

private void startTabbedViewActivity(){
    Intent intent = new Intent(MainScreen.this, TabbedView.class);
    intent.putExtra(SPORT_NAME_EXTRA, selectedSportName);
    intent.putExtra(HEADLINES_FOR_SPORT_EXTRA, existingSportHeadlines.get(selectedSportName));
    intent.putExtra(SCORES_FOR_SPORT_EXTRA, existingSportScores.get(selectedSportName));
    intent.putExtra(SCHEDULE_FOR_SPORT_EXTRA, existingSportSchedule.get(selectedSportName));
    startActivity(intent);
}

何らかの理由で、doInBackground() で何も起こらずにコードを実行すると、ダイアログが消え、TabbedView アクティビティが開始されます。

しかし、doInBackground() を使用してコードを実行すると、ダイアログは消えますが、TabbedView アクティビティは開始されません。だから私は何か違うことをすることができるのだろうかと思っていますか?

4

2 に答える 2

5

はい、メソッドにAsyncTaska を渡さずに使用できます。StringdoInBackground()

1 番目と 3 番目のジェネリック型を からStringに変更するだけVoidです。

class DownloadWebPageTask extends AsyncTask<Void, Void, Void> {

}

ドキュメントから:

非同期タスクで使用される 3 つのタイプは次のとおりです。

1)Params、実行時にタスクに送信されるパラメーターのタイプ。

2) 進行状況、期間中に公開された進行状況ユニットのタイプ

3) バックグラウンド計算。結果、バックグラウンド計算の結果の型。

の署名については、onPostExecuteこれを試してください:

@Override
protected void onPostExecute(Void unused) {

}

編集

パラメータについては、実際には非常に単純です。

このことを考慮:

class MyTask extends AsyncTask<Type1, Type2, Type3> {
    @Override
    protected void onPreExecute() {
    }

    @Override
    protected Type3 doInBackground(Type1... param) {
    }

    @Override
    protected void onProgressUpdate(Type2... progress) {
    }

    @Override
    protected void onPostExecute(Type3 result) {
    }
}

Type1Type2、およびType3がどうあるべきかを判断するには、次の 3 つの質問を自問する必要があります。

  • タスクにどのパラメーターを渡す必要がありますか? =>タイプ1

  • 処理中に表示する必要がある中間結果のタイプは何ですか? =>
    Type2

  • 結果の操作のタイプは何ですか? => Type3

あなたの場合、データをダウンロードしているURLがグローバルに定義されているのか、それをタスクに渡したいのかわかりません。グローバルに定義されている場合、Type1Voidにする必要はありません。

それをタスクに渡したい場合は、それをdoInBackground()メソッドに渡すことができ、 Type1Stringになります。

明らかに、あなたのケースではType2onPostExecute()について心配する必要はありません。なぜなら、中間結果を公開しておらず、その後Type3の結果で何もしていないからですVoid

要約すると、次のようになります。

class DownloadWebPageTask extends AsyncTask<String, Void, Void> {
      @Override
      protected Void doInBackground(String... urls) {
         // do something with urls[0]
      }

      @Override
      protected void onPostExecute(Void unused) {
         // dismiss pd and start new intent
      }
}

または:

class DownloadWebPageTask extends AsyncTask<Void, Void, Void> {
      @Override
      protected Void doInBackground(Void... unused) {

      }

      @Override
      protected void onPostExecute(Void unused) {
         // dismiss pd and start new intent
      }
}

あなたのニーズに応じて。それは十分に明確ですか?

于 2012-05-02T23:24:43.460 に答える
1

ジェネリックを指定するだけVoidですAsyncTask

 class DownloadWebPageTask extends AsyncTask<Void, Void, Void> {

AsyncTaskジェネリックセクションを見てください

于 2012-05-02T23:25:52.413 に答える