ThreadLocal
执行ThreadLocal对象的set(Object obj)
方法,将会向存入一个以当前线程为
键的键值对
执行ThreadLocal对象的get()方法,将
会根据当前线程对象为键,取出与之
对应的值
Handler的post()方法。
// private static Message getPostMessage(Runnable r){ // Message m = Message.obtain(); // m.callback = r; // return m; // } // 1,该方法完成了两个操作,第一个生成了一个Message对象,第二,将r对象赋值给Message对象的callback属性 // 第一个问题,如何把一个Runnable对象放置在消息队列当中:实际上是生成了一个Message对象,并将r赋值给Message对象的callback属性 // 然后再将Message对象放置在消息队列当中 // 第二个问题,Looper取出了携带r对象的Message对象之后,干了些什么? 取出Message对象之后调用了dispatchMessage方法,然后判断Message的callback属性是否为空, // 此时的callback属性有值,所以执行了handleCallback(Message msg), 在该方法中执行了msg.callback.run(); public class MainActivity extends Activity { private Button button; private Handler handler = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = (Button) findViewById(R.id.button); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { TestThread tt = new TestThread(); tt.start(); } }); } class TestThread extends Thread { @Override public void run() { Runnable r = new Runnable() { @Override public void run() { //这里可以写更新UI的代码。 String currentThreadName = Thread.currentThread().getName(); Log.d("MainActivity", "当前线程的名称————》" + currentThreadName); } }; //post(r)方法将应用r对象放置在消息队列当中,Looper对象(MainThread)从消息队列当中取出了r对象 //我们猜测:取出r对象之后 //1.Thread t = new Thread(r); //2.t.start(); //根据测试的结果可以看出,该思路是错误的 //我们的问题是Looper取出了r对象之后,干了些什么? handler.post(r); } } }