作者givemepass (〆)
看板AndroidDev
标题[问题] Handler & Thread 的问题
时间Tue Sep 24 22:03:27 2013
Android内一执行Activity的时候,
就会开一支main thread在後面运行,
我想要测试Handler的两种方法
sendMessage 以及 post的差异
第一种
private Handler mHandler = new Handler(){
public void handleMessage(Message msg){
switch(msg.what){
case 0:
Log.e("HandlerThreadID",
Long.toString(Thread.currentThread().getId()));
Log.e("HandlerThreadName--->",Thread.currentThread().getName());
break;
}
}
};
private Thread mThread = new Thread(new Runnable() {
public void run() {
Log.e("ThreadID",
Long.toString(Thread.currentThread().getId()));
Log.e("ThreadName", Thread.currentThread().getName());
Message msg = new Message();
msg.what = 0;
handler.sendMessage(msg);
}
});
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mThread.start();
Log.e("ActivityThreadID",
Long.toString(Thread.currentThread().getId()));
Log.e("ActivityThreadName",Thread.currentThread().getName());
}
测出来的结果是
ThreadID: 78
ThreadName: Thread-78
ActivityThreadID: 1
ActivityThreadName: main
HandlerThreadID: 1
HandlerThreadName: main
由此可知 new 一个Thread以後, 就会开启另外一支thread来执行,
但是透过handler传讯息以後, 就会跑回main thread。
第二种写法
private class MyHandler extends Handler{
public MyHandler(){
Log.e("HandlerThreadID",
Long.toString(Thread.currentThread().getId()));
Log.e("HandlerThreadName",Thread.currentThread().getName());
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MyHandler mHandler2 = new MyHandler();
mHandler2.post(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
Log.e("RunnableThreadID",
Long.toString(Thread.currentThread().getId()));
Log.e("RunnableThreadName",Thread.currentThread().getName());
}
});
//mThread.start();
Log.e("ActivityThreadID",
Long.toString(Thread.currentThread().getId()));
Log.e("ActivityThreadName",Thread.currentThread().getName());
}
结果是这样
HandlerThreadID: 1
HandlerThreadName: main
ActivityThreadID: 1
ActivityThreadName: main
RunnableThreadID: 1
RunnableThreadName: main
并没有产生新的thread
我的原本解读是Runnable并不会产生新的thread,
而是会去找寻原本的main thread帮忙执行run()这个方法
这样是否表示执行大量运算就会被卡住?
然後为了证实前面的想法是对的,
因此我又做了第三个范例
private class MyThread extends Thread{
public MyThread(Runnable r){
super(r);
Log.e("ThreadID",Long.toString(Thread.currentThread().getId()));
Log.e("ThreadName",Thread.currentThread().getName());
}
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MyHandler mHandler2 = new MyHandler();
mHandler2.post(
new MyThread(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
Log.e("RunnableThreadID",
Long.toString(Thread.currentThread().getId()));
Log.e("RunnableThreadName",Thread.currentThread().getName());
}
}));
//mThread.start();
Log.e("ActivityThreadID",
Long.toString(Thread.currentThread().getId()));
Log.e("ActivityThreadName",Thread.currentThread().getName());
}
结果竟然
HandlerThreadID: 1
HandlerThreadName: main
ThreadID: 1
ThreadName: main
ActivityThreadID: 1
ActivityThreadName: main
RunnableThreadID: 1
RunnableThreadName: main
因此我得到结论
post的方法并不会产生新的thread
而sendMessage的方式会产生新的thread
上面的结论是错的
应该说两个方法都不会自动产生新的thread
而sendMessage所产生的thread
是由我们自己所启动的
城市马
http://uploadingit.com/file/fpctqb7fdbvjnwao/HandlerThreadDemo.zip
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.46.162.97
1F:→ elba:透过Handler送到伫列的工作是在建立Handler的执行绪做处理 09/24 22:56
2F:→ elba:sendMessage跟post的差异已经在程式中展示了 09/24 22:59
3F:→ elba:sendMessag收Message物件,要透过handleMessage处理 09/24 23:01
4F:→ qweqweqweqwe:其实有点不懂为什麽得到第三个结论会很惊讶 @@? 09/24 23:01
5F:→ elba:post收Runnable物件 09/24 23:02
6F:→ givemepass:第三个我开了一支thread可是却还是main thread所以我 09/24 23:06
7F:→ givemepass:觉得惊讶 09/24 23:06
8F:→ elba:Thread.start才会启动新的执行绪 09/24 23:15
真的欸 我居然忘记要start才会产生thread
我後来去爬Handler的source code发现post最终传进去的Runnable
也只是被指派为Message的Runnable物件而已
但是sendMessage是由我们去启动一支thread
所以会产生另外一支thread
感谢解惑 不过这样一来代表我的结论是错的XD
※ 编辑: givemepass 来自: 114.46.162.97 (09/24 23:45)
9F:→ qweqweqweqwe:XD 所以才说为什麽第三个结论很惊讶 09/24 23:46
10F:推 tac0wu:sendMessage为什麽会产生一只Thread 09/26 22:25
11F:→ tac0wu:整篇唯一会产生thread只有mThread.start() 这个吧 09/26 22:26