aidl ( 四) 各部分代码的执行进程和线程
来源:互联网 发布:淘宝导航 编辑:程序博客网 时间:2024/05/22 05:13
首先看bind service时,onServiceConnected是在前台进程的主线程内,但是bindService可以不在主线程里执行
myAIDLInterface.setCallback(callback);这句话会跨进程,调用service内的setCallback,执行service的setCallback是在service的非主线程内(service的oncreate为主线程,setCallback其实是在binder线程中调用的).换句话说,myAIDLInterface.setCallback(callback);会导致后台进程执行setCallback,后台进程会开一个子线程(就是binder线程)来执行setCallback。
线程id如下:
service mainthread id1
set callbackthread id5852
接着,再看mCallback.showTime(count); 这也是跨进程的,会导致前台进程执行showTime(),这是在前台进程的非主线程里执行。也就是说,mCallback.showTime(count); 会导致前台进程启动一个子线程(binder线程)来执行showTime().日志如下,可见每次aidl调用会让前台进程启动一个线程去执行showTime,而且这个线程不是固定的,有时候是5830,有时候是5831.
05-28 22:22:52.319 13421-13432/com.example.fish.aidlclient1 D/FishLog﹕ callback305-28 22:22:52.319 13421-13432/com.example.fish.aidlclient1 D/FishLog﹕ process namecom.example.fish.aidlclient105-28 22:22:52.319 13421-13432/com.example.fish.aidlclient1 D/FishLog﹕ thread id583005-28 22:22:52.319 13421-13421/com.example.fish.aidlclient1 D/FishLog﹕ handleMessage05-28 22:22:54.319 12514-13435/com.myservice D/FishLog﹕ callback05-28 22:22:54.319 13421-13433/com.example.fish.aidlclient1 D/FishLog﹕ callback405-28 22:22:54.329 13421-13433/com.example.fish.aidlclient1 D/FishLog﹕ process namecom.example.fish.aidlclient105-28 22:22:54.329 13421-13433/com.example.fish.aidlclient1 D/FishLog﹕ thread id583105-28 22:22:54.339 13421-13421/com.example.fish.aidlclient1 D/FishLog﹕ handleMessage05-28 22:22:56.349 12514-13435/com.myservice D/FishLog﹕ callback05-28 22:22:56.349 13421-13432/com.example.fish.aidlclient1 D/FishLog﹕ callback505-28 22:22:56.349 13421-13432/com.example.fish.aidlclient1 D/FishLog﹕ process namecom.example.fish.aidlclient105-28 22:22:56.359 13421-13432/com.example.fish.aidlclient1 D/FishLog﹕ thread id583005-28 22:22:56.359 13421-13421/com.example.fish.aidlclient1 D/FishLog﹕ handleMessage
总结下:
aidl调用会导致被调用进程启动一个子线程来执行实际代码。
因此后台service通过aidl调用前台进程的话,要注意无法在调用函数体内执行ui更新操作,因为此函数是在非主线程中执行的
0 0
- aidl ( 四) 各部分代码的执行进程和线程
- Android中AIDL的使用步骤、传递对象以及各部分代码的执行线程
- 经典Java线程池的代码及各部分功能简介
- Linux 下C语言学习(四)——变量的类型和程序各部分代码在内存中的位置
- Android 中aidl调用执行线程和同步异步问题
- 将进程变成一个线程执行代码
- SQL查询语句各部分的执行顺序
- for循环各部分的执行顺序
- Java类中各部分的执行顺序
- 线程交替执行的代码
- 07.进程和线程编程之四
- 测试浏览器是否单进程和单线程的代码
- VC:执行远程线程注入的代码段导致目标进程崩溃
- 线程是进程的一条执行路径
- 进程、线程、并发执行的概念
- 进程、线程、并发执行的概念
- 将进程变成一个线程执行代码2
- AsyncTask生命周期和生命周期各部分的作用
- eclipse安装maven插件的步骤
- ice demo中关于#if compact #endif宏解释
- android 代码混淆导致问题,快速定位
- Vi编辑命令
- iOS开发-retain/assign/strong/weak/copy/mutablecopy/autorelease区别
- aidl ( 四) 各部分代码的执行进程和线程
- 让UILabel的文字顶部对齐
- sgu237:Galaxy X: Episode I - Masters of Mind(字符串DP)
- int变量在最新xcode出现的问题
- Hadoop之——Partitioner编程
- Hibernate数据库写入图片
- hdu1405——The Last Practice
- Datagridview合并单元格
- git add .失败解决办法