Android回撥機制簡單總結:Handler更新UI
為了滿足專案正常執行有些時候會使用到介面的回撥機制,因為之前在操作Fragment和Activity之間進行通訊時用到過介面的回撥機制,當時沒有總結的想法,現在又要使用時,發現已經存有模糊的記憶了,為了便於複習,再次稍作總結一下。
這裡的功能是通過handler非同步執行緒來更新UI,handler此處存放在其他類中。
首先準備一個Activity,一個介面,一個其他類。
原理:如果要更新UI,肯定首先是要獲取更新UI的哪個元件,其次是要更新的資料。如果在同一個Activity下更新當然好操作了,只需要得到佈局中的相應元件,再進行填充資料就可以了。由於本文講述介面的回撥機制,那麼用回撥機制該怎麼做呢?請看簡單描述:首先要建立一個通訊的介面,在該介面中定義一個方法,此方法返回值是更新UI的元件,如TextView,另外讓我們的Activity去實現該介面,之後我們就成功的例項化了該介面,該Activity就是介面的子類,到這裡就很明瞭了,Activity可以獲得各種元件。通過Activity實現的該介面的方法可以將需要的元件傳出去。動作的執行:其他類此處就開始有用場了,因為元件我們已經得到,怎樣傳給該類呢?當然此處還是的用介面了,通過宣告該介面,因為只有去例項化該接口才能得到該介面中的方法,所以說我們還得提供一個例項化該介面的方法,因為我們之前已經例項化了該介面,發現沒?就是Activity。所以在該類中我們需要提供一個方法來讓Activity把它自己傳進來。因為該類我們是可以new出來的。通過以上方法,我們可以將Activity中的元件成功的傳進其他類中,其他類再使用handler去獲取非同步資料。
大致原理已梳理完畢,請看關鍵程式碼:
介面ICallBack
public interface ICallBack {
//得到元件
public TextView getText();
}
Activity:
public class SecondActivity extends Activity implements ICallBack {
private TextView txt;
private Button btn;
private Bean bean = new Bean(this);
@Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.show);
txt = (TextView) findViewById(R.id.txtShow);
btn = (Button) findViewById(R.id.btnToMain);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
bean.updateUI();
}
});
//bean.setICallBackListener(this);
}
@Override
public TextView getText() {
return txt;
}
}
其他類:Bean
private ICallBack iCallBack;
// public void setICallBackListener(ICallBack iCallBack) {
// this.iCallBack = iCallBack;
// }
public Bean(ICallBack iCallBack){
this.iCallBack=iCallBack;
}
private TextView txtView;
private Handler mHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 1:
txtView.setText((CharSequence) msg.obj);
break;
default:
break;
}
};
};
class MyThread implements Runnable {
@Override
public void run() {
Message msg = mHandler.obtainMessage();
msg.what = 1;
msg.obj = "我是從handler發過來的訊息....";
mHandler.sendMessage(msg);
}
}
public void updateUI() {
txtView = iCallBack.getText();
new Thread(new MyThread()).start();
}