我正在尝试重现与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
上找到有关它的更多信息答案 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一样工作