gpt4 book ai didi

java - 如何使用 android 使用 FutureTask 或 BackgroundTask 实现 .get 功能?

转载 作者:IT老高 更新时间:2023-10-28 23:35:10 28 4
gpt4 key购买 nike

我正在制作一个 android 库。在我的库中我希望允许用户在后台或主线程中执行特定任务

我想做这样的事情。

第一个场景

MyLibabry.with(context)
.performSomeTask(<params>)
.execute();

当用户编写上述代码段时。该任务应在后台执行。所以我将使用任何监听器返回任务的结果。

现在考虑下面的代码 fragment 。

第二个场景

Result result = MyLibabry.with(context)
.performSomeTask(<params>)
.get();

现在,当用户在语句末尾附加 get() 时。该任务应该在主线程上执行并阻塞其他线程。这就是 result 立即初始化的原因。

所以我的问题是,如果用户附加了 .get(),我如何实现该功能,performSomeTask() 中的线程应该在主线程上运行。否则在后台。

注意:不要专注于返回结果。我将在 Java 泛型中实现它。 我想知道的是如何使代码可重用,以便当用户仅附加 .get() 时,它将在主线程上运行。否则,相同的代码应该在后台运行。我不想写重复的代码。

您可以引用现有的库。

  • AsyncTask - 用于执行后台任务的 Android 官方。
  • ION - 用于下载/上传文件

所以两个库具有相同的功能,还有更多的库具有相同的功能,我也想做同样的。

如果有人为此提供一个小例子,那就太好了。

最佳答案

(我希望您在上面的示例中通过返回值来澄清)所以这是针对您的任务的几种类型的单一解决方案。仔细查看在新线程中运行的任务。您需要在后台 ThreadPool 中启动您的操作....

注意!(另外我希望你澄清使用后台线程。例如,使用上面的代码和函数 .execute() - 不会启动新线程,而只是将新任务用于从静态线程池中的 BlockingQueue 执行)

那么接下来呢?使用函数 .get() 在 MainThread 中执行任务,您需要将此任务发布到当前操作循环中。你将帮助 Handler 和 Looper。回答你的问题,你应该知道,你只有一种方法来完成这项任务。 使用方法 .execute() 在后台线程中启动操作并使用方法 .get() 向 Handler 启动新任务。就是这样!


如果你想了解一些实现的例子,有很多种解决方案。我只是使用 Handler 和 HandlerThread 发布单曲,以简化此示例的工作。

public class MyLibrary extend HandlerThread {

private static Handler backgroundHandler;
private static Handler foregroundHandler;
private static MyLibrary myLibrary

private MyLibrary () {
super(MyLibrary.class.getSimpleName());
start();
}

public static MyLibrary getInstance() {
if (myLibrary == null) {
synchronized (MyLibrary.class) {
if (myLibrary == null) {
myLibrary = new MyLibrary();
}
}
}
return myLibrary;
}

public static WorkingTask with (Context context) {
//Just update, if there are null
if (foregroundHandler == null) {
foregroundHandler = new Handler(context.getMainLooper);
}

if (backgroundHandler == null) {
backgroundHandler = new Handler(getLooper);
}
return new WorkingTask();
}

public void getBackgroundHandler () {
return backgroundHandler;
}
public void getForegroundHandler () {
return foregroundHandler;
}
}


// ..........


public class WorkingTask {
private Runnable workingRunnable;

public performTask (Runnable run) {
this.workingRunnable = run;
return this;
}

public void execute () {
MyLibrary.getInstance().getBackgoundHandler()
.postRunnable(workingRunnable)
}

public void get () {
MyLibrary.getInstance().getForegroundHanlder()
.postRunnable(workingRunnable)
}
}

关于java - 如何使用 android 使用 FutureTask 或 BackgroundTask 实现 .get 功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38071528/

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