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, 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
        //使用返回的数据
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值