【问题标题】:AsyncTask equivalent in javajava中的AsyncTask等价物
【发布时间】:2016-07-16 07:41:22
【问题描述】:

在 android 中有运行线程的 AsyncTask,然后我可以使用 post execute 的方法再次与主线程交互。 java中是否有与此等价的功能?我正在尝试在单独的线程(doInBackground)上运行一个计时器,一旦时间结束,它将允许我与主线程交互以重新启动服务(onPostExecute 将重新启动服务)

【问题讨论】:

标签: java multithreading timer


【解决方案1】:

我不是 Android 开发人员,但我认为它可以通过在 Java 8 上使用 CompletableFuture 轻松实现:

import java.lang.reflect.InvocationTargetException;
import java.util.concurrent.CompletableFuture;
import javax.swing.SwingUtilities;

public abstract class AsyncTask <Params, Progress, Result> {
    protected AsyncTask() {
    }

    protected abstract void onPreExecute();

    protected abstract Result doInBackground(Params... params) ;

    protected abstract void onProgressUpdate(Progress... progress) ;

    protected abstract void onPostExecute(Result result) ;

    final void  publishProgress(Progress... values) {
        SwingUtilities.invokeLater(() -> this.onProgressUpdate(values) );
    }

    final AsyncTask<Params, Progress, Result> execute(Params... params) {
        // Invoke pre execute
        try {
            SwingUtilities.invokeAndWait( this::onPreExecute );
        } catch (InvocationTargetException|InterruptedException e){
            e.printStackTrace();
        }

        // Invoke doInBackground
        CompletableFuture<Result> cf =  CompletableFuture.supplyAsync( () -> doInBackground(params) );

        // Invoke post execute
        cf.thenAccept(this::onPostExecute);
        return this;
    }
}

【讨论】:

  • 我不是专家,但我认为您只是重新发明了 Java 中已经内置的 Executors framework
  • 我的目的是提供一个与 AsyncTask 具有相似功能的类,该类可以与 Java 8 上的 Swings 库一起使用。绝对可以将其用作 Executors 框架的一部分,因为您可以定义另一个方法 execute(Params ...参数,执行者执行者)。而且Executors框架不支持类似onPostExecute的回调/延续机制。
  • @TuanDo,为什么不直接使用 SwingWorker 呢?
【解决方案2】:

为您量身定制的解决方案

总之看java: run a function after a specific number of seconds

出于您的目的,您不需要AsyncTaskAsyncTask 用于运行需要时间的东西,但您不希望它不需要(例如复杂的计算或从互联网获取数据)。这是为了解决您需要等待的问题。
相反,您想要做的是引入延迟,或者更准确地说,您希望安排一些行动在延迟之后发生。您也可以为此使用AsyncTask 之类的类,但这样做太过分了,并且会导致代码更复杂。您应该改用为延迟执行量身定制的类,即TimerTimerTask

new java.util.Timer().schedule(
        new java.util.TimerTask() {
            @Override
            public void run() {
                // your code here
            }
        },
        5000
);

相当于标准 Java 中的 AsyncTask

请注意,AsyncTask 连接到一个 UI 概念(UI = 用户界面),因为它可能只能从 UI 线程启动。它不是为了一般异步运行的东西。

因此,android 的AsyncTask 的最佳匹配等效项是Java 中的SwingWorker。 Swing 是 Java 的标准 UI 框架。它具有与带有 UI 线程的 android 类似的概念。在 Swing 中,这个线程被称为 Event Dispatch Thread。因此,SwingWorker 的设计也与AsyncTask 非常相似。甚至doInBackground() 方法在两个类中都具有相同的名称。

一般异步执行

如果您的要求与 UI 无关,并且您只想获取一些耗时的操作以便异步执行,那么您需要查看执行程序。有多种不同的方法可以将执行程序用于许多不同的目的,因此这超出了此答案的范围。如果您有兴趣了解更多信息,请从Jakob Jenkov's tutorial on ExecutorService 开始。

【讨论】:

    猜你喜欢
    • 2019-11-03
    • 2011-10-06
    • 2010-09-08
    • 2012-05-09
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 2013-01-15
    相关资源
    最近更新 更多