1. 程式人生 > >Android回撥機制簡單總結:Handler更新UI

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();
    }