杂文总结--2


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


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


handler能够分发Message对象和Runnable对象到主线程中, 每一个Handler实例,都会绑定到建立他的线程中(通常是位于主线程),oop


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


===================================================================spa

回调函数Run()执行完,线程终止,因此若是你要让线程不断的作一些耗时的事情的时候,你应该在回调函数里整一个循环。线程


===================================================================对象

建立线程的两种方法:blog


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匿名内部类时这时候当前的线程仍是主线程。

相关文章
相关标签/搜索