Java 活动与异步任务冲突?如何在GUI中实现异步任务?
我为我糟糕的英语技能感到抱歉。我不熟悉编程/stackoverflow,并尝试创建一个android小测验应用程序。此应用程序必须连接到php服务器并登录/getquestion 最简单的例子是登录。用户必须输入数据,然后我必须连接。 为了保证Gui不会冻结,我必须使用异步任务 以下是活动代码:Java 活动与异步任务冲突?如何在GUI中实现异步任务?,java,android,android-asynctask,Java,Android,Android Asynctask,我为我糟糕的英语技能感到抱歉。我不熟悉编程/stackoverflow,并尝试创建一个android小测验应用程序。此应用程序必须连接到php服务器并登录/getquestion 最简单的例子是登录。用户必须输入数据,然后我必须连接。 为了保证Gui不会冻结,我必须使用异步任务 以下是活动代码: public void login(final String username, final String password) { final Activity a = this;
public void login(final String username, final String password) {
final Activity a = this;
FutureTask t = new FutureTask(new Callable() {
public Object call() {
Connection.GetInstance(a).login(username,password);
afterLoginTry(username,password);
return null;
}
});
t.run();
}
这将调用另一个类中的方法,该类调用另一个FutureTask
,该类调用AsyncTask
。最后总是有一个公共同步方法,例如afterlogintry()
。这是可行的,但速度有点慢,而且我认为代码很脏
我的主要问题是,我不知道如何通过不同的类层返回结果,尤其是在不始终使用修补程序的情况下返回活动
有没有什么好的解释或教程来描述如何设计这样的结构
Thx for help将
异步任务
结果传递回其他类的方法是声明该任务的回调,然后将结果报告给侦听器。下面是它的工作原理
首先,必须在AsyncTask
中声明一个接口,该接口包含一个将发送任务结果的方法。在下面的示例任务中,我的结果是一个字符串。当任务完成其工作时,字符串被传递到onPostExecute()
。然后,我在注册的侦听器上调用回调方法,并将该返回值传递给正在侦听它的人。通过传入创建任务的任何类的回调实例来注册侦听器
public class MyTask extends AsyncTask<String, Void, String> {
MyTaskCallback listener;
public MyTask(MyTaskCallback listener) {
this.listener = listener;
}
protected String doInBackground(String... params) {
String input = params[0];
//do work
input += "did some work on this String";
return input;
}
//When the thread finishes its work, this gets
//called on the main UI thread
protected void onPostExecute(String result) {
listener.onResultReceived(result);
}
public interface MyTaskCallback {
void onResultReceived(String result);
}
}
现在,我们的任务通过传入的回调将我们的活动连接到它。现在,当我们的任务得到一个结果时,我们可以直接将它发送给我们的侦听器,这是我们的活动,结果将直接发送到我们实现的onResultReceived
方法
回调是在类之间传递信息的一种很好的方式,同时还可以使所有内容保持非常分离。希望这有帮助
public class TaskActivity extends AppCompatActivity implements MyTask.MyTaskCallback {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_layout);
//we pass in "this" because our Activity itself
//implements the callbacks below.
MyTask myTask = new MyTask(this);
myTask.execute();
}
//Here we implement our callback method, so the task
//can send its results straight through here
public void onResultReceived(String theResult) {
Log.d("TASK RESULT", "Here is our result String: "+theResult);
}
}