【发布时间】:2021-01-31 09:29:36
【问题描述】:
我正在构建一个应用程序,它从多个网页中抓取价格,然后在所有任务完成后显示结果。一切正常,除了我正在努力添加进度条。
以下是我正在尝试做的简化版本。按下按钮后,程序运行 2 个任务:第一个任务休眠 3 秒,第二个任务 - 7 秒。全部完成后,将显示来自每个任务的 toast 消息。
公共类 MainActivity 扩展 AppCompatActivity {
Button button;
ProgressBar progressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = findViewById(R.id.btn);
progressBar = findViewById(R.id.pb);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
progressBar.setVisibility(View.VISIBLE);
ExecutorService executorService = Executors.newFixedThreadPool(5);
executorService.submit(new Task1());
executorService.submit(new Task2());
executorService.shutdown();
try {
executorService.awaitTermination(1, TimeUnit.MINUTES);
} catch (InterruptedException e) {
e.printStackTrace();
}
progressBar.setVisibility(View.INVISIBLE);
}
});
}
private class Task1 implements Runnable {
@Override
public void run() {
try {
Thread.sleep(3000);
Log.d("task1", "run: ");
} catch (InterruptedException e) {
e.printStackTrace();
}
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "task1", Toast.LENGTH_SHORT).show();
}
});
}
}
private class Task2 implements Runnable {
@Override
public void run() {
try {
Log.d("task2", "run: ");
Thread.sleep(7000);
} catch (InterruptedException e) {
e.printStackTrace();
}
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "task2", Toast.LENGTH_SHORT).show();
}
});
}
}
}
据我了解,问题是使用 awaitTermination 方法时所有线程都被阻塞,包括 UI 线程,因此只有在所有任务完成后才会显示任务结果。
有没有办法等到所有任务完成,同时仍然显示进度条?
【问题讨论】:
标签: android concurrency executorservice android-progressbar