工作需要,移植过好几款3G,其实就3G本身而言;移植的难度不大,底层无非是虚拟USB串口(2.6以后一般都是用高速或全速)。上层作为我们硬件厂商来讲,要实现的,主要是根据不同的3G模块,重新整理生成自己的libreference-ril.so动态库了(一般的电话或短信基本功能这里就够了),有机会我也具体总结下,3G的移植,以及网络更新时间和基站定位等功能的实现。
今天遇到个问题,就是产品中“自定义3G开关”耗时问题,.这是以前“领导”留下的;自定义3G开关,只系统起来后,给用户一个开光,让其去打开3G和关闭3G。而这个开关的功能是:通过“插桩”的方式控制LINUX内核中3G的打开和关闭,以及扩展一个OnPreferenceChangeListener,显示3G的运行状态。主要的考虑是功耗问题。
但是原来一直好用的这个APP,再新的产品中确出现两个问题!1,打开3G开关的时候,手去碰下屏幕,就会弹出activity崩溃的;2,串口经常会提示找不到libreference-ril.so的DEBUG
现象很恐怖,但是问题还是一下就让我怀疑可能是耗时任务引起的、
查看代码:在点击开关的时候,控制底层打开3G,然后会根据虚拟串口是否打开来开启上层我们的3G daemon(ril-daemon)
- if(enable){
- Native.3G_on();//打开底层虚拟串口
- <span style="color:#cc0000;"> while</span>(true){// 等待虚拟串口是否打开
- File desFile = new File ( "/dev/ttyUSB*" ) ;
- if (desFile.exists())
- {
- break;
- }
- }
- SystemService.start("ril-daemon");//打开了,开启进程
很明显,这个会有个耗时任务,刚好这个模块的虚拟串口打开并不是非常快速。而居然用while所以这个线程就一直阻塞在这里了。
解决的方式很多人也都知道,
- Thread background = new Thread(new Runnable() { //建一个后台运行的线程,没S钟发消息给Handler,让其去处理这种耗时的事情
- public
void run() {
- for (int i = 0; i < 100 && flag; i++) {
- try{
- Thread.sleep(1000);
- }catch(InterruptedException e){
- }
- Message message = new Message();
- message.what = 1;
- handler.sendMessage(message);
- }
- }
- });
- if(flag){
- background.start();
- }
- }
- Handler handler = new Handler() {
- public
void handleMessage(Message msg) { - //auto
- switch(msg.what){
- case
1: - File desFile = new File ( "/dev/ttyUSB*" ) ;
- if (desFile.exists())
- {
- SystemService.start("ril-daemon");
- }else{
- //............................
- }
|