使用異步消息處理更新UI線程

1. AndroidUI時線程不安全的,若是在子線程中更新UI會出現異常,致使程序崩潰。java

爲了解決如上這些問題,咱們經常使用的作法就是使用Android的異步消息機制實現便可(建立一個Message對象,使用Handler發送出去,而後在HandlerhandleMessage()方法中得到剛纔發送的Message對象,而後在這裏進行UI操做)。因此說仍是頗有必要了解異步消息機制的Looper , Handler , Message等原理的。android

下面展現一個示例使用,而後經過源碼分析吧。安全

public class MainActivity extends Activity {
    public static final int UPDATE_TEXT = 1;
    private TextView text;
    private Button changeText;
    private Handler handler = new Handler(){
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what){
            case UPDATE_TEXT:
                text.setText("Nice yo see you again");
                break;
            default:
                break;
        }
    }
};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text = (TextView) findViewById(R.id.text);
        changeText = (Button) findViewById(R.id.change_text);
//        changeText.setOnClickListener(this);
        changeText.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                switch ((view.getId())){
                    case R.id.change_text:
                        new Thread(new Runnable() {
                            @Override
                            public void run() {
//                                若直接更新TextView的內容會報錯,下面使用異步消息處理機制
//                                text.setText("Nice to see you,BUG");
                                Message message = new Message();
                                message.what = UPDATE_TEXT;
                                handler.sendMessage(message);
                            }
                        }).start();
                        break;
                    default:
                        break;
                }
            }
        });
    }
}

這裏咱們先是定義了一個整型常量UPDATE_TEXT,用於表示更新TextView 這個動做。而後新增一個Handler 對象,並重寫父類的handleMessage 方法,在這裏對具體的Message進行處理。若是發現Message what 字段的值等於UPDATE_TEXT,就將TextView 顯示的內容改爲Nice to see you again異步

下面再來看一下Change Text 按鈕的點擊事件中的代碼。能夠看到,此次咱們並無在子線程裏直接進行UI 操做,而是建立了一個Messageandroid.os.Message)對象,並將它what 字段的值指定爲UPDATE_TEXT,而後調用Handler sendMessage()方法將這Message 發送出去。很快,Handler 就會收到這條Message,並在handleMessage()方法中對它進行處理。注意此時handleMessage()方法中的代碼就是在主線程當中運行的了,因此咱們能夠放心地在這裏進行UI 操做。接下來對Message 攜帶的what 字段的值進行判斷,若是等於UPDATE_TEXT,就將TextView 顯示的內容改爲Nice to see you againide

經常使用的APP在線自動化測試工具:www.ineice.com工具

相關文章
相關標籤/搜索