[Android] 如何將多個原始參數傳遞給AsyncTask?


Answers

另一種方法:您只需在MyTask類中添加MyTask構造函數:

private class MyTask extends AsyncTask<String, Void, Void> {
    int foo;
    long bar;
    double arple;

    MyTask(int foo, long bar, double arple) { 
         // list all the parameters like in normal class define
        this.foo = foo;
        this.bar = bar;
        this.arple = arple;
    }
    ......   // Here is doInBackground etc. as you did before
}

然後打電話

new MyTask(int foo, long bar, double arple).execute();

第二種方式像David Wasser的答案。

Question

有相關的問題,比如我如何將2個參數傳遞給AsyncTask類? ,但我遇到了徒勞地試圖將多個基元作為參數傳遞給AsyncTask的困難,所以我想分享我發現的東西。 這個微妙之處並不在現有的問題和答案中,所以我想幫助那些遇到同樣問題的人,並幫助他們解決問題。

問題是這樣的:我有多個原始參數(例如兩個長),我想傳遞給一個AsyncTask以在後台執行 - 如何完成? (我的答案......經過一段時間的努力......可以在下面找到。)




內置的execute方法接受一個Params數組,但它們都必須是定義的類型..所以如果你簡單地將PARAM類型設置為OBJECT,那麼只要它們是對象的子對象就可以傳入你喜歡的任何東西。 ...

private class MyTask extends AsyncTask<Object, Void, Void> {

然後在doInBackGround中,您只需將每個參數依次轉換為您所需的參數即可:

 @Override
 protected void doInBackground(Object... params) {
     Context t = (Context)parms[0];
     String a = (String) params[1];
     List<LatLng> list = (List<LatLng>)params[2];
     .
     .
     .

你的執行很簡單:

 new MyTask().execute(context,somestring,list_of_points);

不如將它封裝在自己的包裝類,捆綁包或散列或其他類型中,因為您的訂單依賴於雙方,但它可以工作。 當然,你可以讓你的數組成為HashMap(,)的一個參數,而且你基本上是在這個時候自定義實現一個bundle,但它會起作用。




我喜歡malajisi的方法,但如果你沒有,你不能使用Bundle類嗎?

 Bundle myBundle = new Bundle();
 myBundle.putInt("foo", foo);
 myBundle.putLong("bar", bar);
 myBundle.putDouble("arple", arple);

然後只需傳遞該包並將其解包到MyTask中。 這是一個可怕的想法? 您避免創建自定義類,如果您決定稍後需要傳遞其他參數,則它很靈活。