2013-04-18 121 views
6

我正在使用大量AsyncTasks的應用程序。當我開始參與這個應用程序的編碼時,targetSdkVersion被設置爲10,所以我們對AsyncTasks沒有問題,因爲它們全部在並行後臺線程上執行。由於我們已經將targtSdkVersion設置爲17,所以我們在任務中遇到了一些問題,因爲它們現在在單個後臺線程上執行。爲了解決這個問題,我發現下面的代碼專門使用並行任務:Android AsyncTask作爲方法參數

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
    myTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
} else { 
    myTask.execute(); 
} 

現在,因爲我們有幾個任務需要幾行代碼,我想編寫我們自己的Utils類中的方法,以這種方式執行任務......但我無法實現這一點,因爲我無法將不同的任務作爲參數傳遞給方法,因爲'參數|進展|結果'的東西不同,從一個任務到另一個。 有沒有辦法實現我們的目標?有任何想法嗎?

+0

你方法可以採取的AsyncTask 爲PARAM,我覺得 – njzk2

+0

已經嘗試過,但沒有工作......我一直都想與:java.lang.ClassCastException:java.lang.Object []不能轉換爲java.lang.Void [] –

回答

9

由於AsyncTask是一個參數化類,您需要使用泛型。事情是這樣的:

@SuppressLint("NewApi") 
static <P, T extends AsyncTask<P, ?, ?>> void execute(T task, P... params) { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
    task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params); 
    } else { 
    task.execute(params); 
    } 
} 

使用這樣的:

MyAsyncTask task = new MyAsyncTask(); 
Utils.execute(task); 
+0

BAM!作品!我們也嘗試過這樣的事情,但我們總是得到相同的例外......所以非常感謝您的解決方案! :) –

+1

我也能夠使它與簽名靜態<參數,進展,結果>無效執行(AsyncTask <參數,進度,結果>任務,參數...參數)' –