我目前正在使用执行器服务,根据不同参数的if语句做不同的5个任务,完成任务后,我想在用户界面中更新进度条和textview等视图。我的问题是这种方法是好的还是有其他的方法?
private void startTask(String studentName){
ExecutorService service = Executors.newSingleThreadExecutor();
handler = new Handler(Looper.getMainLooper());
if (studentName.equals("name1")){
service.execute(taskOne("example1"));
}else if (studentName.equals("name2")){
File file = ..
service.execute(taskTwo("example1",file));
}else if (studentName.equals("name3")){
}
}
任务1:
private Runnable taskOne(String p1){
return new Runnable() {
@Override
public void run() {
//background task
handler.post(new Runnable() {
@Override
public void run() {
//update UI
}
});
}
};
任务2:
private Runnable taskTwo(String p1, File file) {
return new Runnable() {
@Override
public void run() {
//background task
handler.post(new Runnable() {
@Override
public void run() {
//update UI
}
});
}
};
我认为您不应该将业务逻辑和UI逻辑耦合在一个任务中。一般来说,业务逻辑是不同的,但UI逻辑是相同的。
所以,你应该保持你的任务清晰:
private Runnable taskOne(String p1) {
return () -> {
//background task
};
}
private Runnable taskTwo(String p1, File file) {
return () -> {
//background task
};
}
抽象地维护UI逻辑:
private static void runTask(Runnable task, ExecutorService service) {
CompletableFuture.runAsync(task, service)
.whenComplete((a, b) -> {
// update UI
});
}
private void startTask(String studentName) {
ExecutorService service = Executors.newSingleThreadExecutor();
handler = new Handler(Looper.getMainLooper());
if (studentName.equals("name1")) {
runTask(taskOne("example1"), service);
} else if (studentName.equals("name2")) {
File file = ..
runTask(taskTwo("example1", file), service);
} else if (studentName.equals("name3")) {
}
}
您在代码中使用newSingleThreadExecutor
,这意味着您的任务不会并发运行。这符合你的期望吗?