两个没有什么关系的类,怎么传递数据,或者说,如何把后台执行得到的数据更新给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
//使用返回的数据
}