Android:我如何傳遞參數給AsyncTask的onPreExecute()?


Answers

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)將方法傳遞給異步任務為了避免多次編寫異步任務基礎結構(線程,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;
        }
    });     
}
Question

我使用AsyncTask來加載作為內部類實現的操作。

onPreExecute()我顯示一個加載對話框,然後我再次隱藏onPostExecute() 。 但對於我事先知道的一些加載操作,他們會很快完成,因此我不想顯示加載對話框。

我想通過一個布爾參數來指示,我可以傳遞給onPreExecute()但顯然由於某種原因onPreExecute()不帶任何參數。

明顯的解決方法可能是在我的AsyncTask或外部類中創建一個成員字段,在每次加載操作之前我都必須設置該成員字段,但這看起來不太優雅。 有一個更好的方法嗎?




您可以在任務構造函數中傳遞參數,或者在調用execute時:

AsyncTask<Object, Void, MyTaskResult>

第一個參數(Object)在doInBackground中傳遞。 第三個參數(MyTaskResult)由doInBackground返回。 您可以將它們更改為所需的類型。 三個點意味著可以傳遞零個或多個對象(或它們的一個數組)作為參數。

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

        }
    }

}