Android:AsyncTaskのonPreExecute()にパラメーターを渡すにはどうすればよいですか?


116

AsyncTask内部クラスとして実装したロード操作にを使用します。

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

私はこれに渡すことonPreExecute()ができるブール型パラメーターでこれを示したかったのですが、どういうonPreExecute()わけか何らかの理由でパラメーターを取りません。

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

回答:


231

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

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

3
これはまさに私が今やったことです。私はまだメンバー変数が必要ですが、それがあなたの意味するところであれば、AsyncTaskにあり、外部クラスには必要ありません。これが私がしたことです:プライベートクラスMyAsyncTask extends AsyncTask <Void、Void、Void> {private boolean showLoading; public MyAsyncTask(boolean showLoading){super(); this.showLoading = showLoading; //何かを行う} protected void onPreExecute(){if(showLoading){// ...}} // doInBackground()など。}
Steven Meliopoulos 2010年

1
うん、それはほとんどアイデアでした:)
Felix

1
AsynkTaskコンストラクターでは、実際にはsuper()は必要ありません。
ostergaard 2013

62

1)私にとっては、非同期タスクにパラメーター渡すのが最も簡単な方法です

// To call the async task do it like this
Boolean[] myTaskParams = { true, true, true };
myAsyncTask = new myAsyncTask ().execute(myTaskParams);

このように非同期タスクを宣言して使用する

private class myAsyncTask extends AsyncTask<Boolean, Void, Void> {

    @Override
    protected Void doInBackground(Boolean...pParams) 
    {
        Boolean param1, param2, param3;

        //

          param1=pParams[0];    
          param2=pParams[1];
          param3=pParams[2];    
      ....
}                           

2)async-taskにメソッドを渡す async-Taskインフラストラクチャ(スレッド、messagenhandlerなど)を複数回コーディングすることを避けるために、非同期タスクで実行する必要があるメソッドをパラメーターとして渡すことを検討してください。次の例は、このアプローチの概要を示しています。さらに、コンストラクターで初期化パラメーターを渡すために、非同期タスクをサブクラス化する必要がある場合があります。

 /* Generic Async Task    */
interface MyGenericMethod {
    int execute(String param);
}

protected class testtask extends AsyncTask<MyGenericMethod, Void, Void>
{
    public String mParam;                           // member variable to parameterize the function
    @Override
    protected Void doInBackground(MyGenericMethod... params) {
        //  do something here
        params[0].execute("Myparameter");
        return null;
    }       
}

// to start the asynctask do something like that
public void startAsyncTask()
{
    // 
    AsyncTask<MyGenericMethod, Void, Void>  mytest = new testtask().execute(new MyGenericMethod() {
        public int execute(String param) {
            //body
            return 1;
        }
    });     
}

11

なぜ、どのように、どのパラメータがAsynctask <>に渡されるかについては、こちらをご覧ください。一番いい説明だと思います。

GoogleのAndroidドキュメントは次のように述べています:

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

AsyncTaskのジェネリック型:

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

パラメータ、実行時にタスクに送信されるパラメータのタイプ。進行状況、バックグラウンド計算中に公開される進行状況単位のタイプ。結果、バックグラウンド計算の結果のタイプ。すべてのタイプが常に非同期タスクで使用されるわけではありません。タイプを未使用としてマークするには、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」があります。これらは入力パラメーターのタイプです)、タイプからオブジェクトを返します。 「Z」。

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(); 次のステータスを受け取ることができます。

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

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

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

AsyncTaskの使用に関するヒント

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

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

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

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


4

タスクコンストラクターでパラメーターを渡すか、executeを呼び出すときに指定できます。

AsyncTask<Object, Void, MyTaskResult>

最初のパラメーター(オブジェクト)はdoInBackgroundで渡されます。3番目のパラメーター(MyTaskResult)は、doInBackgroundによって返されます。それらを必要なタイプに変更できます。3つのドットは、0個以上のオブジェクト(またはそれらの配列)が引数として渡されることを意味します。

public class MyActivity extends AppCompatActivity {

    TextView textView1;
    TextView textView2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);    
        textView1 = (TextView) findViewById(R.id.textView1);
        textView2 = (TextView) findViewById(R.id.textView2);

        String input1 = "test";
        boolean input2 = true;
        int input3 = 100;
        long input4 = 100000000;

        new MyTask(input3, input4).execute(input1, input2);
    }

    private class MyTaskResult {
        String text1;
        String text2;
    }

    private class MyTask extends AsyncTask<Object, Void, MyTaskResult> {
        private String val1;
        private boolean val2;
        private int val3;
        private long val4;


        public MyTask(int in3, long in4) {
            this.val3 = in3;
            this.val4 = in4;

            // Do something ...
        }

        protected void onPreExecute() {
            // Do something ...
        }

        @Override
        protected MyTaskResult doInBackground(Object... params) {
            MyTaskResult res = new MyTaskResult();
            val1 = (String) params[0];
            val2 = (boolean) params[1];

            //Do some lengthy operation    
            res.text1 = RunProc1(val1);
            res.text2 = RunProc2(val2);

            return res;
        }

        @Override
        protected void onPostExecute(MyTaskResult res) {
            textView1.setText(res.text1);
            textView2.setText(res.text2);

        }
    }

}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.