首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

自定义3G开关耗时问题

自定义3G开关耗时问题

工作需要,移植过好几款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{  
  •                               //............................
  •                         }  
返回列表