AsyncTask怎么把值返回给UI线程?

两个没有什么关系的类,怎么传递数据,或者说,如何把后台执行得到的数据更新给Activity的ui控件。两个类若要进行数据传递,必然要存在关系。

根据面向对象的依赖倒置原则,我们使用接口来进行解耦。

1) 定义MessageResponse接口,它只有onReceivedSuccess()方法,这个接口代表着成功收到相应的消息后,进一步的处理。
interface MessageResponse{
    void onReceivedSuccess(boolean done);
}

2) 给后台执行的AsyncTask的类,增加一个MessageResponse接口类型的成员,AsyncTask就和这个接口有了关联。并增加该成员的set方法。然后在onpostExeute()方法中,通过这个成员,调用它的onReceivedSuccess()方法。

class MyTask extends AsyncTask, Void, Boolean> {
    private ProgressDialog progressDialog;
    private MessageResponse msgRes;

    public void setMsgRes(MessageResponse msgRes) {
        this.msgRes = msgRes;
    }

    @Override
    protected void onPreExecute() {
    }

    @Override
    protected Boolean doInBackground(Void... voids) {
    }

    @Override
    protected void onPostExecute(Boolean aBoolean) {
        // aBoolean接收doInBackground的执行结果
    progressDialog.dismiss();
        msgRes.onReceivedSuccess(aBoolean);
    }
}

3) 让Activity实现上面的这个接口,在onReceivedSuccess()方法中,可更新相应的控件。在activity中用调用AsyncTask的set方法,把它自己this传进去,然后再调用AsyncTask的执行。等于通过接口,AsyncTask关联了activity的部分,这个部分就是获取消息后更新自己的需求。

public class MainActivity extends Activity implements MessageResponse{
    private MyTask myTask;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    myTask = new MyTask();
        myTask.setMsgRes(this);
        myTask.execute();
    }

    @Override
    public void onReceivedSuccess(boolean done) { //实现接口的方法,要显式的声明为public
        //使用返回的数据
    }

你可能感兴趣的:(android)