Re: [問題] asynctask 加上 CountDownLatch

作者: givemepass (λ)   2016-07-25 19:50:27
※ 引述《valda (valda)》之銘言:
: Hi
: 想請教一個問題
: 目前有一個需求
: 需要等待三個asynctask的結果
: 才能繼續做下一步
: goole到有人說可以使用countdownlatch
: 但我用的時候就一直卡在await
: 就停住了
: 不知道我哪裡寫錯了
: https://gist.github.com/swy680614/34bdc3c9a9ac1719d6a81eafdbbb7df9
簡單寫一下範例
程式碼有點亂 請見諒
定義一個變數
private int taskCount;
對asynctask進行定義
AsyncTask<String, Integer, String> getTask(final int num){
return new AsyncTask<String, Integer, String>() {
private int count;
@Override
protected String doInBackground(String... params) {
while(count < params.length) {
int rand = (int) (Math.random() * 5);
try {
Thread.sleep(rand * 10);
} catch (InterruptedException e) {
e.printStackTrace();
}
count++;
publishProgress(count);
}
return null;
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
taskCount++;
}
@Override
protected void onCancelled() {
super.onCancelled();
taskCount++;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
if(num == 1){
mTask1.setProgress(values[0]);
} else if(num == 2){
mTask2.setProgress(values[0]);
} else if(num == 3){
mTask3.setProgress(values[0]);
}
}
};
}
透過sleep來模擬任務執行的畫面
當每個任務成功或失敗 則加1
先宣告三個任務
String[] strs = new String[100];
for(int i = 0; i < 100; i++){
strs[i] = String.valueOf(i);
}
getTask(1).executeOnExecutor(mExecutors, strs);
getTask(2).executeOnExecutor(mExecutors, strs);
getTask(3).executeOnExecutor(mExecutors, strs);
當三個任務都完成以後 就顯示字串
Executors.newSingleThreadExecutor().submit(new Runnable() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
result.setText("任務尚未完成...");
}
});
while(taskCount < 3);
runOnUiThread(new Runnable() {
@Override
public void run() {
result.setText("全部任務已完成!");
}
});
}
});
這樣應該是一個蠻直覺的作法@@
程式碼
https://github.com/givemepassxd999/asynctask_demo
出來的圖會長這樣
http://tinyurl.com/j52lgos

Links booklink

Contact Us: admin [ a t ] ucptt.com