1. Android的UI時線程不安全的,若是在子線程中更新UI會出現異常,致使程序崩潰。java
爲了解決如上這些問題,咱們經常使用的作法就是使用Android的異步消息機制實現便可(建立一個Message對象,使用Handler發送出去,而後在Handler的handleMessage()方法中得到剛纔發送的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 操做,而是建立了一個Message(android.os.Message)對象,並將它what 字段的值指定爲UPDATE_TEXT,而後調用Handler 的sendMessage()方法將這Message 發送出去。很快,Handler 就會收到這條Message,並在handleMessage()方法中對它進行處理。注意此時handleMessage()方法中的代碼就是在主線程當中運行的了,因此咱們能夠放心地在這裏進行UI 操做。接下來對Message 攜帶的what 字段的值進行判斷,若是等於UPDATE_TEXT,就將TextView 顯示的內容改爲Nice to see you again。ide
經常使用的APP在線自動化測試工具:www.ineice.com工具