2.1知识点一
(1)问题现象
升级下载时很耗CPU,导致界面常停止响应。
(2)原因分析
下载线程一直占有CPU,没有让出来。
(3)解决方案
因为库里面本来就是起一个线程下载,所以直接调用即可,不会影响UI线程。后来放到AsyncTask cpu占用50%左右,这个时候去播放视频会比较卡。最后干脆直接让他们在库里改下载1M字节休息一段时间,之后CPU就降到20%。还比较理想,干其他事不卡。
下载完一定要校验MD5,100M左右,中间断电很有可能下的包不对,即使字节数一样,只要其中两个字节颠倒就会有问题。
(4)后续要注意的地方
测试应用时要关注cpu占用率。再就是下载大的文件的时候,例如100M左右的文件,中间下载得到的包会有问题,必须进行MD5校验。即使字节长度一样,但是中间会有两个字节顺序对换的可能。就会导致后面升级失败。
2.2知识点二
(1)问题现象
pppoe功能的添加。
(2)原因分析
PPPoe 本身是局域网的原理,客户端和服务器在一个局域网内。连上pppoe时只显示IP地址,不显示其他。
(3)解决方案
先看海思的平台是否支持。要熟悉android service框架。例如从XXXmanager到XXXservice。
到systemservice等。
1. 更新脚本 device\hisilicon\godbox\etc\pppoe\ ppp.connect ppp.disconnect ppp.conf等,利用了pppoe底层功能的除了3G,有线PPPOE拨号,还有其他。在这三个配置文件中进行配置。在init.rc中给予其执行权限。真正执行功能是system/bin下pppoe和pppd两个可执行文件。脚本文件除了配置外,再就是启动这两个可执行文件。
2. 添加pppoe服务相关代码。包括:aidl接口,服务端代码:PppoeService.java客户端代码:PppoeManager.java,Native层PppoeNative.java 。JNI代码android_net_pppoe.cpp
3. 在systemServer.java 中把PppoeService加进来。
4.在frameworks/base/core/res/res/values/config.xml中,framework层的资源配置。networkAttributes和radioAttributes等项目。包括pppoe名字即类型,优先级,等配置。在
ConnectivityService类的构造时会读取这个资源文件的这个选项,决定是否要启动PppoeService,PppoeStateTracker,和pppoetracker.startMonitoring监听pppd上报的事件和连接失败是否要重新连接。
5.连接pppoe的启动和断开函数在PppoeStateTracker.java,其中还包括接口的监听,连接之前,其他网络的处理等。
6./system/core/libnetutils/pppoe_utils.c中提供pppoe上层设置的接口名,用户名,密码的保存以供等待的可执行文件读取。
7
内核配置修改:make menuconfig
Device Drivers --->
[*] USB support --->
<*> USB Serial Converter support --->
[*] USB Generic Serial Driver
<*> USB driver for GSM and CDMA modems
8 应用层界面的处理:
加在外面不用考虑跟手动联网和自动联网等状态切换。加在外面:NetworkSetting,加在里面 EtherNetSetting。
2.2知识点三
(1)问题现象
在【本地播放-音乐】中,歌手/专辑有播放过的文件名称残留。
(2)原因分析
插上U盘,板子突然断电后,无法更新U盘挂载信息的数据库。
(3)解决方案
做的事情就是将所有记录在数据库中的某一个用于记录外部设备的状态的键isMounted改为not mount .然后重新获取外部设备状态,如果还存在,即更新最后挂载时间,如果是新插入的,更新本数据库。
要在界面上显示一首歌,那么这首歌所属的U盘的isMounted值必须是true,后面查询加载歌曲的时候都会加上这个查询条件。
放在application类中开机启动会概率性报错:改在onCreate中执行就OK了。错误提示:访问的数据库被死锁。
Sqlite的访问原理:在读一张表的时候,同时需要释放其他写锁,在写一张表的时候,需要释放其他读锁。在开机启动时候,后台就有数据库拷贝工作,U盘插上的时候,都会收到广播来操作此数据库。
(4)后续要注意的地方
注意多任务访问数据库问题。
2.2知识点四
(1)问题现象
测试反应声音较小的问题。
(2)解决方案
AudioFlinger 中setHiplayerVol将音量放到一定倍数。注意AudioFlinger::initMediaVol
不然的话,会在初始的时候声音很小,而切换的时候较大。
1.异步获取多数据经验分享
基于以下结构能够实现多数据的异步获取(对时序没有严格的要求)
public class Assist{
private static final int MAX_TASK_NUM = 5;
private ArrayList<Msg> mMsgQueue;
private MyTask[MAX_TASK_NUM] mTaskList;
private Object mLock;
private void pushMsg(Msg msg){
synchronized(mLock){ mMsgQueue .add(msg);}
}
private void popMsg(){
synchronized(mLock){ mMsgQueue .get(0);}
}
private void notifyMsg(...){//通知UI更新}
private class Msg{...}
private MyTask extends Thread{
public void run(){
if(popMsg(!= null)){...; notifyMsg();}
}
}
}
2.基于现有控件的自定义复杂控件开发
几个原则:
1.尽量将自定义的控件继承于常用的布局,如:linearLayout等
2.将定义了包含控件的layout add进来
3.自定义控件中尽量不要将控件的大小写为定值
4.提供尽量合理,简单的接口供主UI线程调用
5.自定义控件实现的功能尽量单一并易于二次扩展
6.尽量保留android原生控件中已有的各个状态转换接口
4.主要应用问题总结:
1.部分缩略图没有显示成功的问题
原因:由于是从网络实时获取图片,因此存在由于网络原因而下载失败的可能。
解决办法:如果没有下载成功,则尝试重新下载,知道尝试的次 数大于一个合理的最大尝试次数。
2.进入move分类中有可能出现的OutOfMemory 问题
原因:解压到图片全不缓存在内存中而没有做及时的清理
解决办法:在需要下载同一分类的其它图片时,需要先释放掉掉 本分类中已经解码的图片数据。同时当应用退出时,也需要释放 掉所有已经解码的图片数据,回收内存。
3.进入到各个分类后,刷新数据非常慢的问题
原因:1.单线程获取分类数据 2.只有在所有分类数据都获取完毕后才允许用户操作
解决办法:1.多线程下载分类数据
2.下载前边几个分类数据完成之后即允许用户操作
4.各个分类中按遥控器上键无法显示分类名称的问题
原因:原生的scrollview在相应向上操作时,先获取下一个可以获得焦点的控件,然后scrollto到该控件的文件使其能够刚好全部显示。而分类名称在该控件的上方,因此无法显示分类的名称来。
解决办法:重写scrollview 的 arrowScroll接口,在其相应向上案件部分的代码中向上移动的像素减少一个合适的值即可。
5.开机启动进入桌面,第一次按方向键焦点没有落在下边分类选择gallery上的问题
原因:开机后多次调用onresume函数造成改控件的focusable属性改变。从而造成requestfocus失败
解决办法:在requestfocus之前首先判断当前获取处于焦点状态的view,然后判断该view是否为null且是否为该gallery,如果不是,则将gallery的focusable设置成true并让其requestforcus