《Android开发问题集锦第三期》由会员分享,可在线阅读,更多相关《Android开发问题集锦第三期(5页珍藏版)》请在金锄头文库上搜索。
1、 编辑:Tony www.eoeA 2010-11-25 Android 开发集锦第三期 目录目录 问题问题一一:Android 线程同步之线程同步之 join 方法方法 wait 和和 interrupt 问题问题二二:Android Bitmap 平移操作如何实现平移操作如何实现 问题三:问题三:如何强制禁用如何强制禁用 Android 的的 Sensor 方向感应器方向感应器 问题四:问题四:managedQuery 和和 query 的区别的区别-数数据据库查库查询询 API 问题问题五五:EditText 的光标选择的光标选择 问题问题六六:SystemClock.sleep 和和
2、Thread.sleep 的区别的区别 问题问题七:七:java.lang.VerifyError 错误原因错误原因 问题八:问题八:Uri 中的参数问题中的参数问题 问题九问题九:APK 文件安装代码实现文件安装代码实现 问题十问题十:Android 中动态改变中动态改变 ImageView 大小大小 问题问题一一:Android 线程同步之线程同步之 join 方法方法 wait 和和 interrupt 答:在 Android 线程同步处理时如果不考虑并发库 concurrent 使用 Java VM 的原始方法也可以解决一 些简单情况的线程同步问题。 在 Android 中我们可以使用
3、 Java 的 Thread 类的大部分方法,对于等待 Sun 提供了 join 和 wait 两个方法,它们的区别就是前者针对线程为单位的,而 wait 是释放一个锁。当然这里 wait 的锁释放的是相对于 join 方法而言 的,join方法并不需要和 synchoronized 同时使用,当然让 wait()唤醒的方法我们可以使用 Java 提供的 notify 方法,对于所有线 程等待可以使用 notifyAll 方法来处理。 join()是 Thread 类的方法,类似的还有 sleep(),但对应 join 方法的是 interrupt,不过需要注意的是平时使用时需要处理 Inte
4、rruptException 异常。这些均来自 Thread 类 ,而 wait()是 java 基类对象 object 的一个方法,同样对于 object 基类对象还提供了 notify 方法。eoe 社区推荐如果大家在 Android 平台上开发,对于不是复杂的情况可以考虑 AsyncTask 解决,当然如果你的 Java 基础较好考虑 concurrent 可以很好的解决各种问题,有关 concurrent 的具体使用我们将分 10 节来实例说明。 问题问题二二:Android Bitmap 平移操作如何实现平移操作如何实现 答:有网友问 Android 系统下如何实现 Bitmap 向
5、某方向平移操作,有关图片旋转操作可以查看 Android 游戏开发之旅十 位图旋转 这篇, 对于平移我们可以通过 Canvas 类的public void translate (float dx, float dy) 方法来实现,参数一为平面 x 轴的位置,类型为浮点型,参数二为 y 轴的位置。不使用 Matrix 类,我们可以直接构造一个空的 Bitmap 对象,通过 Canvas 类提供的 drawBitmap 方法画出我们需要的 Bitmap 对象,然后调用 translate 方法来实现平移,比如将位图向右平移 2 个像 素,可以为 translate(2,0) 而向下移动 3 个像素
6、translate(0,-3) 问题三:问题三:如何强制禁用如何强制禁用 Android 的的 Sensor 方向感应器方向感应器 答:从 Android 1.5 开始系统可以设置 Sensor 旋转屏幕,如果你的应用在部分方面没有处理好横屏和竖屏的切换,可能需要强制禁用方向感应器 Sensor,相关的方法可以在androidmanifest.xml 的相关 activity 中加入 android:screenOrientation=nosensor 属性。 问题四:问题四:managedQuery 和和 query 的区别的区别-数数据据库查库查询询 API 答:有人问道 managedQ
7、uery 和 query 的区别,我们都知道在 Android 系统中,SQLite数据库的相关操作方式被封装为内容提供 Content Provider,可以帮助那些不会 SQL 语言的开发者快 速实现 Android 平台上的数据库操作, 但是平时我们在查询时一般返回的是 Cursor对 象 , 从 本 质 上 来 看 这 两 个 API 是 不 同 的 类 提 供 的 。 eoe 社 区 提 示 比 如 ContentResolver.query(), 以及 Activity.managedQuery()所以, 我们看到一个是 ContentResolver提供的查询方法,位于 andr
8、oid.content.ContextWrapper.getContentResolver(),另一个则为Activity。 这两种方法的参数是一样的,但是 Activity 类的方法在整个声明周期中受 Activity 的影响, 而常规我们处理数据逻辑可能单独分成一个类, 直 接使用 Context 对象传递实例句柄,同时 eoe 社区还建议大家,对于数据库查询操作如果数据较为庞大尽量使用异步的 AsyncQueryHandler 方法防止阻塞线程。 问题问题五五:EditText 的光标选择的光标选择 答:提起 Android 的 EditText 的光标选择问题,可以通过 android
9、.text.Selection 包提供的方法来实现,Android SDK 提供了有关光标选择的多种方法,比如说 getSelectionEnd、getSelectionStart、removeSelection、 selectAll、setSelection,详细的参数声明如下: 1. final static int getSelectionEnd(CharSequence text) 2. Return the offset of the selection edge or cursor, or -1 if there is no selection or cursor. 3. 4. f
10、inal static int getSelectionStart(CharSequence text) 5. Return the offset of the selection anchor or cursor, or -1 if there is no selection or cursor. 6. 7. final static void removeSelection(Spannable text) 8. Remove the selection or cursor, if any, from the text. 9. 10.final static void selectAll(S
11、pannable text) 11.Select the entire text. 12. 13.final static void setSelection(Spannable text, int index) 14.Move the cursor to offset index. 15.static void setSelection(Spannable text, int start, int stop) 16.Set the selection anchor to start and the selection edge to stop. eoe 社区提示大家,从上面的参数来看,可以发
12、现 Spannable 类型,常规我们的 EditText中的编辑中 Editable 直接实现 Spannable 接口,所以我们可以通过下面的方法来设置选择: Editable ea= etEdit.getText(); /etEdit 为 EditText Selection.setSelection(ea, ea.length()-1); / eoe 社区提示这里 ea 的长度必须大于 1,否则会有异常发生。 问题问题六六:SystemClock.sleep 和和 Thread.sleep 的区别的区别 答: 在 Java 中我们处理线程同步问题时, 处理延迟可能会使用 Thread
13、类的 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.
14、 这里 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.
15、 调用了一些编译器产生异议的问题,可能是使用的 sdk 版本不同,但源代码是一些更老版本的定义。 问题八:问题八:Uri 中的参数问题中的参数问题 答:相比之下部分刚刚入门 Android 的开发者可能会发现 Uri.parse()的参数前面加了file:/, 其实顾名思义Uri类似Url是Universal Resource Identifier的全称, 开头必须是协议名,比如我们 web 服务为 http:/,文件服务为 ftp:/,而文件系统则为 file:/开头,其实 Android内部很多地方都是这样的定义, 比如 SQLite 的 Provider 均为 content:/一样。
16、所以加上路径,Uri.parse 的参数 为 file:/sdcard/cwj.apk 问题九问题九:APK 文件安装代码实现文件安装代码实现 答:很多网友可能需要自己下载 APK 并实现安装,这里说下早期的 APK 安装器中的 APK文件安装代码实现,其实整个实现比较简单,但可以清晰说明 Android 平台的隐式 Intent。在系统安装的底层常规的应用通过系统服务 PackageInstaller 来识别程序安装的 Intent 来执行安装。 1. Intent intent = new Intent(Intent.ACTION_VIEW); 2. intent.setDataAndTy
17、pe(Uri.parse(file:/+ 3. /sdcard/ 4. startActivity(intent); PackageInstaller 服 务 将 会 在 内 部 匹 配MIME类 型 为application/vnd.android.package-archive的 Intent , 要 说 明 的 是setDataAndType 的参数第一个为 URI,其实 URI 内部的 String 对应为 file:/加上常规的路径,当然其 他的 Uri 构造方法还可以 Uri.fromFile(new File(sfileFullPath)。 问题十问题十:AndroidAndroid 中动态改变中动态改变 ImageViewImageView 大小大小 答:很多网友可能发现在 layout.xml 文件中定义了 ImageView 的绝对大小后,无法动态修改以后的大小显示,其实 Android 平台在设计 UI 控件时考虑到这个问题,为了适应不同的 Drawable 可以通过在xml 的相关 ImageView 中加入 android:scaleType=fitXY 这行即可,但因为使用了缩放可能会造成当前UI 有所变形。使用的前提是限制 ImageView 所在的层,可以使用一个内嵌的方法限制显示。