一段很简单的例子程序带来的疑惑。该如何解决
一段很简单的例子程序带来的疑惑。
非常简单一段代码
然后,它的输出结果是:
12-22 13:19:29.361: I/System.out(372): Activity ID:1
12-22 13:19:29.410: I/System.out(372): Activity NAME:main
12-22 13:19:29.471: I/System.out(372): Handler ID:1
12-22 13:19:29.471: I/System.out(372): Handler NAME:main
这让我很不理解,输出结果的顺序和我想的完全相反。
希望有朋友能帮我解释这个输出结果是为何。。。
------解决方案--------------------
handler.post(theadRunnable);通俗点说,post方法的功能好比是向消息队列中放入一个任务theadRunnable,任务放进去后,这个方法就返回了,这个任务并不会立马被执行;主线程继续向下
执行,所以先看到的是main的信息。等main执行完后(这个速度是很快的),再从消息队列中取出
刚才放的任务,并执行这个任务,也就是run方法,所有后看到的是thread信息。一句话:就是Android中所谓的异步机制。
------解决方案--------------------
runable和 onCreate都是在主线程中运行的,也就是main。
runable又不是一个thread, post过去等会还是在主线程消息轮回中之心的。
要新起thread的话,你得创建thread并start它才可以。
------解决方案--------------------
theadRunnable任务其实也是在主线程中执行的!
------解决方案--------------------
这里也没啥异步不异异步的
那些回调函数, onCreate,onPause, onStop等, 和你runable中的run在主线程中的调用过程差不多。
post一个消息,是塞到队列的尾部, 消息循环取队列头上的动作去执行。你的handler.post(theadRunnable);
还要等很久才能排上队执行呢
非常简单一段代码
- Java code
import android.app.Activity; import android.os.Bundle; import android.os.Handler; public class TestHandler extends Activity { private Handler handler=new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); handler.post(theadRunnable); setContentView(R.layout.main); System.out.println("Activity ID:"+Thread.currentThread().getId()); System.out.println("Activity NAME:"+Thread.currentThread().getName()); } private Runnable theadRunnable=new Runnable() { @Override public void run() { // TODO Auto-generated method stub System.out.println("Handler ID:"+Thread.currentThread().getId()); System.out.println("Handler NAME:"+Thread.currentThread().getName()); try { Thread.sleep(100000); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } }; }
然后,它的输出结果是:
12-22 13:19:29.361: I/System.out(372): Activity ID:1
12-22 13:19:29.410: I/System.out(372): Activity NAME:main
12-22 13:19:29.471: I/System.out(372): Handler ID:1
12-22 13:19:29.471: I/System.out(372): Handler NAME:main
这让我很不理解,输出结果的顺序和我想的完全相反。
希望有朋友能帮我解释这个输出结果是为何。。。
------解决方案--------------------
handler.post(theadRunnable);通俗点说,post方法的功能好比是向消息队列中放入一个任务theadRunnable,任务放进去后,这个方法就返回了,这个任务并不会立马被执行;主线程继续向下
执行,所以先看到的是main的信息。等main执行完后(这个速度是很快的),再从消息队列中取出
刚才放的任务,并执行这个任务,也就是run方法,所有后看到的是thread信息。一句话:就是Android中所谓的异步机制。
------解决方案--------------------
runable和 onCreate都是在主线程中运行的,也就是main。
runable又不是一个thread, post过去等会还是在主线程消息轮回中之心的。
要新起thread的话,你得创建thread并start它才可以。
------解决方案--------------------
theadRunnable任务其实也是在主线程中执行的!
------解决方案--------------------
这里也没啥异步不异异步的
那些回调函数, onCreate,onPause, onStop等, 和你runable中的run在主线程中的调用过程差不多。
post一个消息,是塞到队列的尾部, 消息循环取队列头上的动作去执行。你的handler.post(theadRunnable);
还要等很久才能排上队执行呢