Android开发问题集锦(第三期)
(2010-11-29 17:07)
分类: Android
一、Android线程同步之join方法wait和interrupt
三、如何强制禁用Android的Sensor方向感应器 从Android 1.5开始系统可以设置Sensor旋转屏幕,如果你的应用在部分方面没有处理好横屏和竖屏的切换,可能需要强制禁用方向感应器Sensor,相关的方法可以在androidmanifest.xml的相关activity中加入android:screenOrientation="nosensor" 属性。 四、managedQuery和query的区别-数据库查询API 有人问道managedQuery和query的区别,我们都知道在Android系统中,SQLite数据库的相关操作方式被封装为内容提供 Content Provider,可以帮助那些不会SQL语言的开发者快 速实现Android平台上的数据库操作,但是平时我们在查询时一般返回的是Cursor对象,从本质上来看这两个API是不同的类提供的。eoe社区提 示比如 ContentResolver.query(),以及 Activity.managedQuery()所以,我们看到一个是ContentResolver提供的查询方法,位于 android.content.ContextWrapper.getContentResolver(),另一个则为Activity。 这两种方法的参数是一样的,但是Activity类的方法在整个声明周期中受Activity的影响,而常规我们处理数据逻辑可能单独分成一个类,直 接使用Context对象传递实例句柄,同时eoe社区还建议大家,对于数据库查询操作如果数据较为庞大尽量使用异步的 AsyncQueryHandler方法防止阻塞线程。 五、EditText的光标选择 提起Android的EditText的光标选择问题,可以通过android.text.Selection包提供的方法来实现,Android SDK提供了有关光标选择的多种方法,比如说getSelectionEnd、getSelectionStart、removeSelection、 selectAll、setSelection,详细的参数声明如下:
eoe社区提示大家,从上面的参数来看,可以发现Spannable类型,常规我们的EditText中的编辑中Editable直接实现Spannable接口,所以我们可以通过下面的方法来设置选择:
Selection.setSelection(ea, ea.length()-1); // eoe社区提示这里ea的长度必须大于1,否则会有异常发生。 六、SystemClock.sleep和Thread.sleep的区别 在Java中我们处理线程同步问题时,处理延迟可能会使用Thread类的sleep方法,这里抛开concurrent类的一些方法,其实Android平台还提供了一个SystemClock.sleep方法,它们有什么区别呢? 我们每次调用Thread.sleep时可能会出现InterruptedException异常,而SystemClock.sleep方法则不 会,在 SDK上有这样的描述,它将会忽略中断异常。SystemClock.sleep(millis) is a utility function very similar to Thread.sleep(millis), but it ignores InterruptedException. 这里eoe社区要提醒的是下面这句 Use this function for delays if you do not use Thread.interrupt(), as it will preserve the interrupted state of the thread. 七、java.lang.VerifyError错误原因 有网友表示在Android开发中遇到了java.lang.VerifyError错误提示。 1. 大多数可能引用的外部jar文件出现了问题,比如说package的路径产生了问题,但该类被class文件定义了。 2. 调用了一些编译器产生异议的问题,可能是使用的sdk版本不同,但源代码是一些更老版本的定义。 八、Uri中的参数问题 相比之下部分刚刚入门Android 的开发者可能会发现 Uri.parse()的参数前面加了file://,其实顾名思义Uri类似Url是Universal Resource Identifier的全称,开头必须是协议名,比如我们web服务为http://,文件服务为ftp://,而文件系统则为file://开头,其实 Android内部很多地方都是这样的定义,比如SQLite的Provider均为content://一样。所以加上路径,Uri.parse的参数 为file:///sdcard/cwj.apk 九、APK文件安装代码实现 很多网友可能需要自己下载APK并实现安装,这里说下早期的APK安装器中的APK文件安装代码实现,其实整个实现比较简单,但可以清晰说明Android平台的隐式Intent。在系统安装的底层常规的应用通过系统服务PackageInstaller来识别程序安装的Intent 来执行安装。
PackageInstaller服务将会在内部匹配MIME类型为application/vnd.android.package- archive的 Intent,要说明的是setDataAndType的参数第一个为URI,其实URI内部的String对应为file://加上常规的路径,当然其 他的Uri构造方法还可以Uri.fromFile(new File(sfileFullPath))。 十、Android Zip解压缩类处理中文名乱码 目前Android平台上的底层库仍然有很多不完善的地方比如zlib库处理Zip文件时无法对中文文件名做正确的处理,同时无法类似J2SE那样的 android.util.zip类没有setEncoding方法处理。目前解决方法是引入apache的ant库来实现解压缩,同时apache ant库好包含了完整的xml dom4j解析库可以实现document的保存。 当然引入apache ant库的问题是造成程序编译后体积变得臃肿,算法因为是java写的效率上会大打折扣,但是解决下问题还是可以的,重量级处理还是放到服务器上比较好。 目前总体来看Android平台底层库很多地方做的不近人如意,很多关键地方都出现了问题。 |
|