2013-04-18 39 views
6

Tôi đang làm việc trên một ứng dụng sử dụng nhiều AsyncTask. Khi tôi bắt đầu tham gia vào mã hóa của ứng dụng này, targetSdkVersion được đặt thành 10 vì vậy chúng tôi đã không gặp sự cố với AsyncTask vì chúng đều được thực hiện trên các luồng nền song song. Vì chúng ta đã đặt targtSdkVersion thành 17, chúng ta có một số vấn đề với các tác vụ bởi vì chúng bây giờ được thực hiện trên một luồng nền đơn. Để giải quyết vấn đề này, tôi đã tìm thấy đoạn mã sau để sử dụng đặc biệt nhiệm vụ song song:Android AsyncTask làm đối số phương thức

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

Bây giờ, bởi vì chúng tôi có một số nhiệm vụ cần các dòng mã, tôi muốn viết một phương pháp trong lớp Utils riêng của chúng tôi mà thực hiện các nhiệm vụ theo cách này ... nhưng tôi không thể đạt được điều này, bởi vì tôi không thể vượt qua các nhiệm vụ khác nhau để các phương pháp như đối số do 'Param | Tiến trình | Kết quả 'công cụ khác nhau từ một nhiệm vụ khác. Có cách nào để đạt được mục tiêu của chúng tôi không? Bất kỳ ý tưởng?

+0

bạn phương pháp có thể mất một AsyncTask như param, tôi nghĩ – njzk2

+0

đã cố gắng, nhưng đã không làm việc ... Tôi luôn nhận được : java.lang.ClassCastException: java.lang.Object [] không thể chuyển sang java.lang.Void [] –

Trả lời

9

AsyncTask là lớp được tham số hóa, bạn cần sử dụng Generics. Một cái gì đó như thế này:

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

Sử dụng như thế này:

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

BAM! Công trinh! Chúng tôi cũng đã thử một cái gì đó như thế này, nhưng chúng tôi luôn có ngoại lệ tương tự ... vì vậy cảm ơn bạn rất nhiều vì giải pháp này! :) –

+1

Tôi cũng có thể làm cho nó hoạt động với chữ ký 'static void execute (nhiệm vụ AsyncTask , Params ... params)' –

Các vấn đề liên quan