web-dev-qa-db-ja.com

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

内部クラスとして実装したオペレーションの読み込みには、AsyncTaskを使用します。

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

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

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

111

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

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

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、...)を複数回コーディングするのを避けるために、非同期で実行するメソッドを渡すことを検討するかもしれません-taskをパラメーターとして。次の例は、このアプローチの概要を示しています。さらに、コンストラクタで初期化パラメータを渡すために、非同期タスクをサブクラス化する必要があるかもしれません。

 /* 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;
        }
    });     
}
59
Karl

なぜ、どのように、どのパラメータが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」があります。これらは入力パラメーターのTYPESです)。型からオブジェクトを返します。 「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を呼び出すことができます!)。

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

10
Naveed Jamali

タスクコンストラクターでパラメーターを渡すか、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);

        }
    }

}
2
live-love