Android 更新UI方法的深度解析

1. Handler

public class SecondActivity extends Activity {  
    private static final int MSG_WHAT = 101;  
    TextView tv;  
    Button btn;  
    private MyHadler mHandler1;  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main2);  
        tv = (TextView) findViewById(R.id.tv);  
        btn = (Button) findViewById(R.id.btn);  
        mHandler1 = new MyHadler();  
        btn.setOnClickListener(new View.OnClickListener() {  
            @Override  
            public void onClick(View view) {  
                updateUi();  
            }  
        });  
    }  
  
    class MyHadler extends Handler {  
        @Override  
        public void handleMessage(Message msg) {  
            super.handleMessage(msg);  
            switch (msg.what) {  
                case MSG_WHAT:  
                    String str = (String) msg.obj;  
                    tv.setText(str);  
            }  
        }  
    };  
  
    /** 
     * 
     */  
    private void updateUi1() {  
        new Thread() {  
            @Override  
            public void run() {  
                try {  
                    Thread.sleep(5 * 1000);  
                } catch (InterruptedException e) {  
                    e.printStackTrace();  
                }  
                Message message = mHandler1.obtainMessage();  
                message.what = MSG_WHAT;  
                message.obj = "来自子线程的数据";  
                mHandler1.sendMessage(message);  
            }  
        }.start();  
    }  
}  

2.Handler的post()方法

private void updateUi2() {  
    new Thread() {  
        @Override  
        public void run() {  
            try {  
                Thread.sleep(5 * 1000);  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }  
            mHandler1.post(new Runnable() {  
                @Override  
                public void run() {  
                    tv.setText(" Handler.post更新UI");  
                }  
            });  
        }  
    }.start();  
}  

看看post()方法的源码

public final boolean post(Runnable r)  
   {  
      return  sendMessageDelayed(getPostMessage(r), 0);  
   }  

该方法调用了sendMessageDelayed(getPostMessage(r), 0)发送一条消息,下面首先看看 getPostMessage()方法

private static Message getPostMessage(Runnable r) {  
       Message m = Message.obtain();  
       m.callback = r;  
       return m;  
   } 

getPostMessage()方法是将Runnable对象转化为消息对象Message的callback属性。而sendMessageDelayed()方法就不多说 了,又回到Handler的处理机制了。

Handler的dispatchMessage()方法

public void dispatchMessage(Message msg) {  
      if (msg.callback != null) {  
          handleCallback(msg);  
      } else {  
          if (mCallback != null) {  
              if (mCallback.handleMessage(msg)) {  
                  return;  
              }  
          }  
          handleMessage(msg);  
      }  
  }  

可以看到,首先判断如果message的callback不等于null,则调用Handler的handleCallback()方法,否则调用Handler对象的handleMessage()方法。

3. Activity的runOnUiThread()方法

/** 
    * 通过runOnUiThread更新UI 
    */  
   private void updateUi3(){  
       new  Thread(){  
           @Override  
           public void run() {  
               try {  
                   Thread.sleep(3*1000);  
               } catch (InterruptedException e) {  
                   e.printStackTrace();  
               }  
               runOnUiThread(new Runnable() {  
                 @Override  
                 public void run() {  
                     tv.setText("runOnUiThread更新UI");  
                 }  
             });  
  
           }  
       }.start();  
   }  

 看看runOnUiThread()方法的源码

public final void runOnUiThread(Runnable action) {  
      if (Thread.currentThread() != mUiThread) {  
          mHandler.post(action);  
      } else {  
          action.run();  
      }  
  }  

4.View.post(Runnable r)方法

private void updateUi4(){  
       new Thread(){  
           @Override  
           public void run() {  
               super.run();  
               tv.post(new Runnable() {  
                   @Override  
                   public void run() {  
                       tv.setText("view post更新UI");  
                   }  
               });  
           }  
       }.start();  
   }  

 再来看看post()方法的源码

public boolean post(Runnable action) {  
    final AttachInfo attachInfo = mAttachInfo;  
    if (attachInfo != null) {  
        return attachInfo.mHandler.post(action);  
    }  
  
    // Postpone the runnable until we know on which thread it needs to run.  
    // Assume that the runnable will be successfully placed after attach.  
    getRunQueue().post(action);  
    return true;  
}  

 该方法还是调用了Handler的post()方法。Handler的post()方法很重要哦!

 

 

 

 

猜你喜欢

转载自ch-kexin.iteye.com/blog/2361315