一、线程与线程之间进行通信
①、线程的分类 UI线程(主线程)、工作线程
②、通信可能便会想到Handler。通常情况下我们在主线程(
UI线程)与工作线程之间进行通讯
实现数据之间的传递。为什么可以在主线程中进行和工作线程之间进行通讯呢?原因在主线程会
自动开启一个Looper线程,正是这个Looper线程使得可以和工作线程进行通讯。
③、如何实现工作线程与工作线程之间的通信呢。根据主线程和工作线程的实现原理不难发现,我们
我们需要一个Looper线程。所以我们需要在工作线程中去创建一个Looper线程。
eg:
//获取信息的线程
class GetMsgThread
extends Thread{
Handler
mHandler;
public Handler
getHandlerInstance(){
//在Run()方法执行之后才会赋值
return mHandler;
}
@Override
public void run() {
super.run()
;
//创建一个Looper线程
Looper.
prepare()
;
mHandler=
new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg)
;
Log.
i(
"TAG","确认收到消息--------------->"
+
"线程名:"+Thread.
currentThread().getName()
+
"消息:"+msg.
obj
)
;
}
}
;
Looper.
loop()
;
}
}
//发送信息的线程
class SendMsgThread
extends Thread{
@Override
public void run() {
super.run()
;
for (
int i=
0;i>
5;i++){
Message msg = Message.
obtain()
;
msg.
what=
1;
msg.
obj=
"当前时间“"+System.
currentTimeMillis()
;
new GetMsgThread().getHandlerInstance().sendMessage(msg)
;
Log.
i(
"TAG","确认发送消息--------------->"
+
"线程名:"+Thread.
currentThread().getName()
+
"消息:"+msg.
obj
)
;
}
}
}
二、进程与进程之间进行通信
①、进程之间的通信---->四大组件之间ContentProvider内容提供者
a)、contentProvider内容提供者 底层是通过Binder实现,主要用来为其他APP提供数据。
b)、自定义一个内容提供者需要实现6个方法,其中只有onCreate实在主线程中回调的,而
其他5个方法是在Binder中执行的。
c)、自定义的ContentProvider注册时要提供authorities属性,
应用需要访问的时候将属性包装成Uri.parse(
"content://authorities")
d)、ContentProvider有query,delete,insert等方法
②、Socket通信---->java
a)、在服务器中定义ServerSocket来监听端口,客户端使用Socket来请求端口,
连通后就可以进行通信。
③、AIDL---->强大的通信机制
a)、AIDL定义服务端暴露的接口,以提供给客户端来调用,AIDL使服务器可以并行处理,
而Messenger封装了AIDL之后只能串行运行,所以Messenger一般用作消息传递。
④、Messenger---->信使
a)、Messenger是基于AIDL实现的,服务端(被动方)提供一个Service来处理客户端
(主动方)连接,维护一个Handler来创建Messenger,在onBind时返回Messenger的binder。
b)、双方用Messenger来发送数据,用Handler来处理数据。Messenger处理数据依靠Handler,
所以是串行的,也就是说,Handler接到多个message时,就要排队依次处理。
⑤、Bundle、Intent---->传递数据
a)、序列化数据进行信息传递
转载请注明原文地址: https://ju.6miu.com/read-3950.html