Android 子线程中进行UI操做(非发送消息)

除了发送消息以外,咱们还有如下几种方法能够在子线程中进行UI操做:java

1. Handler的post()方法

public boolean post(Runnable action) {  
    Handler handler;  
    if (mAttachInfo != null) {  
        handler = mAttachInfo.mHandler;  
    } else {  
        ViewRoot.getRunQueue().post(action);  
        return true;  
    }  
    return handler.post(action);  
}  
public final boolean post(Runnable r)  {  
   return  sendMessageDelayed(getPostMessage(r), 0);  
}

原来这里仍是调用了sendMessageDelayed()方法去发送一条消息啊,而且还使用了getPostMessage()方法将Runnable对象转换成了一条消息,咱们来看下这个方法的源码:ide

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

在这个方法中将消息的callback字段的值指定为传入的Runnable对象。咦?这个callback字段看起来有些眼熟啊,喔!在Handler的dispatchMessage()方法中原来有作一个检查,若是Message的callback等于null才会去调用handleMessage()方法,不然就调用handleCallback()方法。那咱们快来看下handleCallback()方法中的代码吧:post

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

很简单,就是直接调用了一开始传入的Runnable对象的run()方法。spa

所以在子线程中经过Handler的post()方法进行UI操做就能够这么写:线程

public class MainActivity extends Activity {  
  
    private Handler handler;  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        handler = new Handler();  
        new Thread(new Runnable() {  
            @Override  
            public void run() {  
                handler.post(new Runnable() {  
                    @Override  
                    public void run() {  
                        // 在这里进行UI操做  
                    }  
                });  
            }  
        }).start();  
    }  
}

虽然写法上相差不少,可是原理是彻底同样的,咱们在Runnable对象的run()方法里更新UI,效果彻底等同于在handleMessage()方法中更新UI。code

2. View的post()方法,就是调用了Handler中的post()方法

public boolean post(Runnable action) {  
    Handler handler;  
    if (mAttachInfo != null) {  
        handler = mAttachInfo.mHandler;  
    } else {  
        ViewRoot.getRunQueue().post(action);  
        return true;  
    }  
    return handler.post(action);  
}

3. Activity的runOnUiThread()方法

    若是当前的线程不等于UI线程(主线程),就去调用Handler的post()方法,不然就直接调用Runnable对象的run()方法。对象

public final void runOnUiThread(Runnable action) {  
    if (Thread.currentThread() != mUiThread) {  
        mHandler.post(action);  
    } else {  
        action.run();  
    }  
}
相关文章
相关标签/搜索