6

我试图在 Java 纯代码中重现 Android 的 AsyncTask 遵循的相同逻辑。

为此,我创建了实现我的 IAsynTask 的抽象类 AsyncTask,它基本上调用 onPreExecute、doInBackground 和 onPostExecute,我还创建了执行魔法的方法。

例如,为了在我的登录过程中使用它,我创建了扩展 AsyncTask 的 LoginTask 类,但与我想象的 onPreExecute、doInBackground 和 onPostExecute 的实现不同,它看起来并不是强制性的。我究竟做错了什么?

接口:

public interface IAsyncTask {

    public void onPreExecute();
    public void doInBackground();
    public void onPostExecute();

}

班级:

public abstract class AsyncTask implements IAsyncTask{

    public void onPreExecute() {

    }

    public void doInBackground(){

    }

    public void onPostExecute() {

    }

    public void execute() {

        onPreExecute();

        new Thread(new Runnable() {
            @Override
            public void run() {

                doInBackground();

                Platform.runLater(new Runnable() {
                    @Override
                    public void run() {
                        onPostExecute();
                    }
                });
            }
        }).start();
    }
}

[编辑]

关于 javafx 的问题,我注意到许多新开发人员都面临管理线程的问题。我想分享我为简化在 javafx 上管理线程的生活所做的工作。我创建了一个基于 Android 的 AsyncTask 的 AsyncTask 类,它基本上以一种简陋但有效的方式与 Android 相同。您可以在Github 项目上找到有关它的更多信息

4

2 回答 2

3

如果我不能解释我到底想要什么,我很抱歉,但是当你们看到我的代码之后你们就会明白了。我只是在我的方法中添加了一个抽象标识符并得到了我想要的。这似乎是一个新手问题,但我认为它可以用来简化一些简单的操作,而无需直接管理线程。

我做了什么来使用 Java 和 Javafx 代码重现一个简单的 AsyncTask:

创建一个抽象类 AsyncTask

public abstract class AsyncTask {

    abstract void onPreExecute();

    abstract void doInBackground();

    abstract void onPostExecute();

    public void execute() {

        onPreExecute();

        new Thread(new Runnable() {
            @Override
            public void run() {

                doInBackground();

                //Platform.runLater is a javafx code that executes onPost in Main Thread.
                Platform.runLater(new Runnable() {
                    @Override
                    public void run() {
                        onPostExecute();
                    }
                });
            }
        }).start();
    }
}

从我们的工人阶级扩展它

public class LoginTask extends AsyncTask {

    @Override
    void onPreExecute() {

        //Some code to preexecute in Main Thread
        System.out.println("OnPreExecute - Main Thread: " + Platform.isFxApplicationThread());
    }

    @Override
    void doInBackground() {

        //Some code to execute in background thread as internet requests
        System.out.println("doInBackground - Main Thread: " + Platform.isFxApplicationThread());
    }

    @Override
    void onPostExecute() {

        //Some code to execute in Main thread after background process has done, like update a view
        System.out.println("onPostExecute - Main Thread: " + Platform.isFxApplicationThread());        
    }

}

要调用它,您可以执行以下操作:

LoginTask taskTest = new LoginTask();
taskTest.execute();

你的日志将是:

OnPreExecute - Main Thread: true
doInBackground - Main Thread: false
onPostExecute - Main Thread: true
于 2013-07-11T19:11:33.403 回答
-1

AsyncTask 的核心是一个线程。它是一个从另一个任意线程(但通常是主线程)开始的线程,执行它的任务,然后将一个 post 任务委托给产生它的线程(正如我所说,通常是主线程)。

在处理这个项目时您将遇到的问题是处理(!)我上面提到的这个线程委托功能的 Handler 类。Handler 是 android 的核心功能,允许从非主线程任务委托到创建它的线程。为了实现一种 Java AsyncTask,您需要添加一个线程委托 API,其工作原理与 Handler 相同.

于 2013-07-11T15:06:52.290 回答