跨线程(不是跨进程,一个程序间主要是跨线程,不同程序间跨进程,当然也跨线程)的数据交互,我感觉这个问题是android开发中关键的核心。常见方法有一下几种:

1、利用一个公共的静态类来存储方法。这个公共的静态变量可以在任何线程中被使用,我看到很多acitivity之间就是用这种方式来传递的(这种方式在不同线程间是线程不安全的。这个需要自己去把握了)。这种方式更多传递的是一直不变的量或者一个app应用的公共常量。

2、利用handler去传递,handler的特点是每个线程都有一个独特的loop和消息循环。但是如果要实现子线程(工作线程)发送数据给主线程,就可以在子线程创建handler(指定主线程的,创建handler例如

Handler handler=new Handler(getMainLooper());

)这个方式确实也创建了一个handler对象,但是这个handler对象是绑定了主线程的looper和消息循环,所以可以利用这个handler给主线程发送消息。你可能会问这个会不会造成线程不安全。答案是android系统的消息机制已经给你加了锁,保证了线程同步。当然你也可以在子线程里面之间拿到主线程的handler。这就是所谓的不同线程之间传递handler对象了。这个方式就有很多了。可以重写一个application的类来传递。但是最好不要用static静态变量来弄,因为也可能线程不安全。

有一条知识点需要明确下。一个线程可以有多个handler,但是只能有一个 loop和消息循环。


主线程和子线程数据交互都可以用handler交互。只不过是把各自handler的实例给对方即可。

handler的实质其实就是与thread去绑定,然后利用线程去进行不同的数据交互。以后用的越来越多就越能理解handler的本质。hander建立乃是要绑定线程的,这是它最重要的构造参数。除开ui线程外,其余子线程是必须首先looper初始化,然后让looper.loop进行消息循环。这样任意的类之间,任意的线程之间就能够利用handler这个中介进行很好的数据交互了。

其实如果把所有的文件都写在一个类里面,本质上就是利用的静态的方法来进行传递数据了。如果把不同的文件和不同的类需要进行数据传递的话,静态方法是一个途径,但是如果涉及到回调这类的,并且线程安全的话,handler是一个不错的选择。