Activity与AsyncTask冲突?如何将AsyncTask实现到GUI?

时间:2016-02-15 22:04:55

标签: java android android-asynctask

我很抱歉我的英语能力差。我是编程/ 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。这有效,但它有点慢,我认为是脏代码。

我的主要问题是我不知道如何通过不同的类层给出结果,尤其是不使用修补程序的活动。

是否有任何好的解释或教程,描述了如何设计这样的构造?

寻求帮助

1 个答案:

答案 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方法。

回调是在类之间传递信息同时保持一切非常分离的好方法。希望这有帮助!