118

AsyncTask内部クラスとして実装した読み込み操作に を使用します。

onPreExecute()読み込みダイアログを表示し、 で再び非表示にしonPostExecute()ます。しかし、一部の読み込み操作については、非常に迅速に終了することが事前にわかっているため、読み込みダイアログを表示したくありません。

渡すことができるブール値パラメーターでこれを示したかったのですonPreExecute()が、明らかに何らかの理由でonPreExecute()パラメーターを取りません。

明らかな回避策は、おそらく、すべての読み込み操作の前に設定する必要がある AsyncTask または外部クラスにメンバー フィールドを作成することですが、それはあまり洗練されていないようです。これを行うより良い方法はありますか?

4

4 に答える 4

235

コンストラクターをオーバーライドできます。何かのようなもの:

private class MyAsyncTask extends AsyncTask<Void, Void, Void> {

    public MyAsyncTask(boolean showLoading) {
        super();
        // do stuff
    }

    // doInBackground() et al.
}

次に、タスクを呼び出すときに、次のようにします。

new MyAsyncTask(true).execute(maybe_other_params);

編集:これは、タスクの呼び出しを簡素化するため、メンバー変数を作成するよりも便利です。上記のコードを以下と比較してください。

MyAsyncTask task = new MyAsyncTask();
task.showLoading = false;
task.execute();
于 2010-06-19T20:05:36.053 に答える
11

なぜ、どのように、どのパラメーターが Asynctask<> に渡されるかについては、こちらの詳細を参照してください。もっともな説明だと思います。

Google の Android ドキュメントには次のように書かれています。

非同期タスクは、Params、Progress、および Result と呼ばれる 3 つのジェネリック タイプと、onPreExecute、doInBackground、onProgressUpdate、および onPostExecute と呼ばれる 4 つのステップによって定義されます。

AsyncTask のジェネリック型:

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

Params、実行時にタスクに送信されるパラメーターのタイプ。進行状況、バックグラウンド計算中に発行された進行状況単位のタイプ。結果、バックグラウンド計算の結果の型。すべての型が常に非同期タスクで使用されるわけではありません。タイプを未使用としてマークするには、単にタイプ Void を使用します。

 private class MyTask extends AsyncTask<Void, Void, Void> { ... }

さらに参照できます:http://developer.android.com/reference/android/os/AsyncTask.html

または、Sankar-Ganesh のブログを参照して、AsyncTask の役割を明確にすることができます

さて、典型的な AsyncTask クラスの構造は次のようになります。

private class MyTask extends AsyncTask<X, Y, Z>

    protected void onPreExecute(){ 

    } 

このメソッドは、新しいスレッドを開始する前に実行されます。入力/出力値はありませんので、変数を初期化するか、必要だと思うことを何でもしてください。

protected Z doInBackground(X...x){

}

AsyncTask クラスで最も重要なメソッド。メインスレッドとは別のスレッドで、バックグラウンドで実行したいすべてのものをここに配置する必要があります。ここでは、入力値として「X」型のオブジェクトの配列があり (ヘッダーに表示されていますか?「...extends AsyncTask」があります。これらは入力パラメーターの型です)、型からオブジェクトを返します。 「ズ」。

protected void onProgressUpdate(Y y){

このメソッドはメソッド publishProgress(y) を使用して呼び出され、通常、バックグラウンドで実行中の操作の進行状況を示す進行状況バーのように、進行状況または情報をメイン画面に表示する場合に使用されます。

protected void onPostExecute(Z z){

このメソッドは、バックグラウンドでの操作が完了した後に呼び出されます。入力パラメーターとして、doInBackground メソッドの出力パラメーターを受け取ります。

X、Y、Zタイプはどうですか?

上記の構造から推測できるように:

X – The type of the input variables value you want to set to the background process. This can be an array of objects.

 Y – The type of the objects you are going to enter in the onProgressUpdate method.

 Z – The type of the result from the operations you have done in the background process.

外部クラスからこのタスクを呼び出すにはどうすればよいでしょうか? 次の2行だけで:

MyTask myTask = new MyTask();

myTask.execute(x);

ここで、x は X 型の入力パラメーターです。

タスクを実行すると、「外部」からそのステータスを確認できます。「getStatus()」メソッドを使用します。

myTask.getStatus(); 次のステータスを受け取ることができます。

RUNNING - タスクが実行中であることを示します。

PENDING - タスクがまだ実行されていないことを示します。

FINISHED - onPostExecute(Z) が終了したことを示します。

AsyncTask の使用に関するヒント

メソッド onPreExecute、doInBackground、および onPostExecute を手動で呼び出さないでください。これは、システムによって自動的に行われます。

別の AsyncTask または Thread 内で AsyncTask を呼び出すことはできません。メソッド execute の呼び出しは、UI スレッドで行う必要があります。

メソッド onPostExecute は UI スレッドで実行されます (ここで別の AsyncTask を呼び出すことができます)。

タスクの入力パラメーターはオブジェクト配列にすることができます。このようにして、必要なオブジェクトとタイプを配置できます。

于 2015-09-30T15:43:01.930 に答える