hprose / hprose-java

Hprose is a cross-language RPC. This project is Hprose 2.0 for Java
MIT License
550 stars 187 forks source link

Android: 有需要解析的域名的URI的TCP client,会发生在主线程解析域名的异常 #41

Closed zhangchn closed 6 years ago

zhangchn commented 6 years ago

由于Connector类的create方法实质上在caller当前线程同步调用了InetSocketAddress的构造方法,这一调用如果发生在主线程,会导致android的NetworkOnMainThreadException

andot commented 6 years ago

在创建客户端时,并不会创建连接,连接是在调用时才创建的,同步调用本来就不应该在主线程中使用,所以这应该不是个问题。

zhangchn commented 6 years ago

目前看到的状况是,在主线程调用TCP Client的subscribe就会造成同步调用Connector的create方法。

不太明白为什么这里没有被schedule到线程池。

andot commented 6 years ago

subscribe 方法在调用时,如果没有指定客户端 id 参数,它会自动调用 autoId 方法来获取客户端 id,而如果客户端 id 没有初始化的情况下,它会首先同步调用 invoke 方法来获取客户端 id,使用同步调用而不是异步调用,是为了防止多个订阅重复获取 id,保证先获取到 id,再进行订阅。

所以,如果你没有指定客户端 id,就进行订阅的话,在 android 中需要单独开一个线程来进行该操作。