如何在Java纯代码中从Android重现AsyncTask

时间:2013-07-11 14:42:59

标签: java android

我正在尝试重现与Java纯代码中Android的AsyncTask相同的逻辑。

为此,我创建了抽象类AsyncTask,实现了我的IAsynTask,它基本上调用onPreExecute,doInBackground和onPostExecute,同时我创建了魔法发生的方法execute。

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

Inteface:

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();
    }
}

[EDITED]

关于javafx的问题,我注意到许多新开发人员正面临着管理Threads的问题。我想分享一下我为简化在javafx上管理线程的生活所做的工作。我已经基于Android的AsyncTask创建了一个AsyncTask类,它基本上以简单但有效的方式执行Android的相同操作。您可以在Github project

上找到有关它的更多信息

2 个答案:

答案 0 :(得分:2)

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

我使用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

答案 1 :(得分:-1)

AsyncTask是其核心,一个线程。它是一个在另一个任意线程(但通常是主线程)中启动的线程,完成它的任务,然后将一个post任务委托给产生它的线程(正如我所说,通常是主线程)。

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