您的位置:首页 > 其它

Handler.post()

2015-08-16 01:27 375 查看
handler.post()方法存在的价值在于

从网络中获取数据在Worker Thread中执行

而后修改ui 在主线程中执行

实现通讯 需要在主线程中生成一个Handler对象

在Worker Thread中使用sendMessage(msg)方法将msg发送到消息队列中

然后在主线程中通过handler.handleMessage(msg)来修改ui

通过handler.post(Runnable r)的机制 就可以直接在Worker Thread中编写线程体

而实际上是在主线程中执行 较上述另一种方法更方便

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

<Button
android:id="@+id/buttonId"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="button"/>

</RelativeLayout>


private Handler handler= new Handler();
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button)findViewById(R.id.buttonId);
ButtonListener buttonListener = new ButtonListener();
button.setOnClickListener(buttonListener);
}

class ButtonListener implements View.OnClickListener {

@Override
public void onClick(View v) {
PostThread postThread = new PostThread();
postThread.start();
}
}

class PostThread extends Thread{

@Override
public void run(){
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("当前线程名字为" + Thread.currentThread().getName());
}
};
handler.post(runnable);
}
}


handler属于主线程 主线程会自动生成Looper对象

Handler handler = new Handler()将Handler Looper MessageQueue绑定

以下是post源码

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


getPostMessage(r)方法 通过调用Message.obtain()生成并返回新的Message对象msg

并将新生成的msg的callback属性赋值为Runnable runnable

sendMessageDelayed()通过内部多次调用不同方法

将msg加入消息队列MessageQueue queue = mQueue(属于主线程 且已与handler绑定)

同时msg.target = handler

综上 handler.post(runnable)将callback值为runnable的msg 加入与handler绑定的MessageQueue

与handler绑定属于主线程的Looper就会通过loop()方法 处理加入消息队列的msg

loop()方法会调用 msg.target.dispatchMessage(msg);

以下是handler.dispatchMessage(msg)的源码

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


可以看出因为msg.callback = r 不为空

所以调用handleCallback(msg)

以下是HandleCallback(msg)的源码

private static void handleCallback(Message message) {
message.callback.run();
}


可以看出 直接执行runnable.run()对于线程体直接执行 则不会新开线程

所以runnable对象直接在主线程中执行
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: