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