首页 > 代码库 > 杂文总结--2

杂文总结--2


实现线程:继承Thread类或者实现Runnable接口


由于Handler运行在主线程中(UI线程中),  它与子线程可以通过Message对象来传递数据, 这个时候,Handler就承担着接受子线程传过来的(子线程用sedMessage()方法传弟)Message对象,(里面包含数据)  , 把这些消息放入主线程队列中,配合主线程进行更新UI


handler可以分发Message对象和Runnable对象到主线程中, 每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程),


Android系统的应用程序是消息驱动的,系统会为每一个应用程序配备一个消息队列,当应用程序运行的时候,该应用程序的主线程会不断的查看消息队列看看有没有消息要处理。


===================================================================

回调函数Run()执行完,线程终止,所以如果你要让线程不断的做一些耗时的事情的时候,你应该在回调函数里整一个循环。


===================================================================

创建线程的两种方法:


1.直接继承Thread,重写run()函数

Public  class MyThread extends Thread{


@override

public void run(){


//线程的实现体

}

}


New MyThread().start();




2.实现接口Runnable

Public  Class MyRunnable implements Runnable{


@override

public void run(){


//线程的实现体

}
}


New Thread(new MyRunnable()).start();


两种方法的比较:其实两种方法从源码上来看本质是一样,都是调用了create(ThreadGroup group, Runnable runnable, String threadName, long stackSize)函数,只是两种方法再调用的时候传递的参数不一样,


直接继承Thread类的方法:create(null, null, threadName, 0);

实现Runnable接口的方法:create(group, runnable, threadName, 0);

主要区别在于第二个参数,如果为空表示线程的执行方法为继承Thread的类的回调函数run(),如果为runnable,表示线程的执行方法为Runnablerun()方法。


===================================================================


Android中更新UI的操作必须放在被更新的UIRoot线程中,即创建它的线程中。


Android提供了两种事件处理机制:基于监听器的事件处理、基于回调函数的事件处理。


Runnable 究竟是什么?

wKioL1Nw30LD-SUGAAEP_pdVYco356.jpg

Runnable 其实只是一个普通的接口,它带有一个抽像函数run(),仅此而已。Runnable不是线程,只是我们可以使用Runnable来作为参数创建线程,我们知道创建线程的两种方法:一是MyThreadObject.start() 另外一种是ThreadMyRunnable.Start()。

因此来看下面的代码:

wKioL1Nw32ujpRTPAAC_jLtWyJ8849.jpg

刚开始是的误解:

1.handler 实现UI更新的原理

2.创建labelTimer控件的线程是主线程,这里(划红线的部分)不是子线程来更新主线程创建的控件吗?怎么不会出错?


解答疑问一:

Handler一直在main thread中执行,有一个不断循环的Looper,不断检索一个容器MessageQueue,这个容器,一旦有Message进来就去执行这个Message,如果这个Message有callback(一个Runnable,如果是handler.post(runnable)的话, 会生成一个Message对象,这个对象的callback参数被赋值成这个runnable对象),那么也去执行这个callback(也就是runnable对象)的run方法(这个就很类似我上面例子中的Test类中的Say方法了,仅仅只是调用这个run方法而已,不是去开线程).


解答疑问二:

Runnable只是一个普通的接口,创建Runnable匿名内部类时这时候当前的线程还是主线程。