我很抱歉我的英语能力差。我是编程/ stackoverflow的新手,并尝试创建一个小的Android测验应用程序。这个应用程序必须连接到PHP服务器和登录/ getquestion ...
最简单的例子是登录。用户必须输入他的数据,然后我必须连接。 为了提供Gui不冻结我必须使用异步任务。
这里是活动的代码:
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
的{{1}}。最后总是有一个公共同步方法,例如AsyncTask
。这有效,但它有点慢,我认为是脏代码。
我的主要问题是我不知道如何通过不同的类层给出结果,尤其是不使用修补程序的活动。
是否有任何好的解释或教程,描述了如何设计这样的构造?
寻求帮助
答案 0 :(得分:1)
将AsyncTask
结果传递回其他类的方法是通过声明任务的回调,然后将结果报告给侦听器。下面是它的工作原理。
首先,您必须在AsyncTask
中声明一个包含将发送任务结果的方法的接口。所以在我下面的示例任务中,我的结果是一个String。当任务完成其工作时,String将传递给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);
}
}
接下来我们需要为这些回调注册一个监听器,所以当结果从任务进入时,它将直接报告给我们的类。所以我们假设我们有一个简单的活动。我们注册回调的方法是在类声明中使用implements
关键字,然后在类本身中实际实现回调方法。然后我们创建我们的任务,然后传入this
这是我们实现回调的Activity。执行此操作的简单示例如下所示:
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);
}
}
现在,我们的任务通过我们传递给它的回调将我们的Activity连接到它。所以现在当我们的任务得到一个结果时,我们可以直接将它发送给我们的监听器,这是我们的Activity,结果将直到我们实现的onResultReceived
方法。
回调是在类之间传递信息同时保持一切非常分离的好方法。希望这有帮助!