gpt4 book ai didi

java - 并行运行长作业,并且仅在所有作业完成后更新 UI

转载 作者:行者123 更新时间:2023-12-01 12:43:06 25 4
gpt4 key购买 nike

我正在构建一个 Android 应用程序,但我在架构方面遇到了一些问题 - 如何在不同线程上实现多个调用。

我有两种方法:

ConnectAndGetId() //takes 2-3 seconds
GetTokenID(ID) //takes 2-3 seconds

首先,我需要调用 ConnectAndGetId(),然后在获取结果 ID 后调用 GetTokenID(ID)。获得 tokenID 后,我需要调用 4 个方法并传递它们 tokenID:

getNames (tokenID) //takes 4 second
getPhones (tokenID) //takes 7 seconds
getIds(tokenID) //takes 2 seconds
getDetailObject(tokenID) //takes 5 seconds

这个想法是在我获得所有 4 种方法的结果后显示数据。不需要一一执行它们,因为这会花费很多时间(18秒),我想并行运行它们,最后用所有数据来更新UI

我想做下一件事:
启动 AsyncTask 并调用 ConnectAndGetId,在 onPostExecute() 中启动另一个 AsyncTask 并在那里运行 GetTokenID( ID)。运行 GetTokenID(ID) 后,我将返回结果到 UI 线程,并使用返回的数据启动 4 个新的 线程,每个线程将调用 4 个方法之一。我可以计算已完成的线程,当我获得所有 4 个结果时,我可以使用处理程序更新 UI

这是正确的方法吗?也许我不应该为 4 个方法创建 4 个线程?否则创建一个 handlerThread 并将 4 个方法传递给他的处理程序,以便线程将它们池化 - 但它将是一个一个的。

这是正确的想法还是可以做得更好?

最佳答案

这是正常的做法。但我建议您使用Executor,但不要创建Threads。示例:

public class TasksSample {
public static void execute(){
ExecutorService executorService = Executors.newFixedThreadPool(4);
executorService.submit(new Task("A"));
executorService.submit(new Task("B"));
executorService.submit(new Task("C"));
executorService.submit(new Task("D"));
executorService.shutdown();
try {
executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}

System.out.println("all tasks finished");
}

private static class Task implements Runnable{

private String taskId;

public Task(String taskId) {
this.taskId = taskId;
}

@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}

System.out.println("finished task: " + taskId);
}
}
}

关于java - 并行运行长作业,并且仅在所有作业完成后更新 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24905981/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com