一、Handler介紹
在一個線程中存在一個消息隊列,當消息隊列中存在消息時,Handler就會處理這些消息;我們考慮一下這種場景:
我們要執行一個耗時很長的業務,執行完後要返回一個結果顯示在TextView上,我們在主線程中執行這種業務是否合理呢?
顯然是不合理的,因此我們會想到把業務放到子線程中執行,但是Android有個規定:所有更新UI的操作全要在主線程中完成,因此我們要做的就是把子線程執行完的結果傳到主線程中並顯示,這就需要Handler的幫忙;
比如ProgressBar、TextView的使用都會用到Handler;
當應用5秒內沒有響應用戶的輸入,則會拋出以下錯誤:
Handler的原理如下:
模板代碼:
- package org.xiazdong.handler;
-
- public class SampleActivity extends Activity {
- private Button button;
- private Handler handler = new Handler(){
- @Override
- public void handleMessage(Message msg) {
- if(msg.what == 1){
- //更新UI
- }
- if(msg.what == 2){
- //更新UI
- }
- }
- };
- private OnClickListener listener = new OnClickListener() {
- class ServiceThread extends Thread{
- private ServiceListener serviceListener = new ServiceListener() {
- @Override
- public void onService(int current) {//服務監聽器
- //一邊執行,一邊發送消息給主線程
- handler.sendMessage(msg);
- }
- };
- @Override
- public void run() {
- //執行業務
- }
- }
- @Override
- public void onClick(View v) {
- ServiceThread thread = new ServiceThread(); //子線程執行業務
- thread.start();
- }
- };
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- button = (Button)this.findViewById(R.id.button);
- button.setOnClickListener(listener);
-
- }
- }