Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3520605
  • 博文数量: 864
  • 博客积分: 14125
  • 博客等级: 上将
  • 技术积分: 10634
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-27 16:53
个人简介

https://github.com/zytc2009/BigTeam_learning

文章分类

全部博文(864)

文章存档

2023年(1)

2021年(1)

2019年(3)

2018年(1)

2017年(10)

2015年(3)

2014年(8)

2013年(3)

2012年(69)

2011年(103)

2010年(357)

2009年(283)

2008年(22)

分类: Java

2010-11-29 17:07:44

  一、Android线程同步之join方法wait和interrupt

  在Android线程同步处理时如果不考虑并发库concurrent使用Java VM的原始方法也可以解决一 些简单情况的线程同步问题。在Android中我们可以使用Java的Thread类的大部分方法,对于等待Sun提供了 join和wait两个方法,它们的区别就是前者针对线程为单位的,而wait是释放一个锁。当然这里wait的锁释放的是相对于join方法而言 的,join方法并不需要和synchoronized同时使用,当然让wait()唤醒的方法我们可以使用Java提供的notify方法,对于所有线 程等待可以使用notifyAll方法来处理。

  join()是Thread类的方法,类似的还有sleep(),但对应join方法的是interrupt,不过需要注意的是平时使用时需要处理 InterruptException异常。这些均来自Thread类 ,而wait()是java基类对象object的一个方法,同样对于object基类对象还提供了notify方法。eoe社区推荐如果大家在Android平台开发,对于不是复杂的情况可以考虑AsyncTask解决,当然如果你的Java基础较好考虑concurrent可以很好的解决各种问题,有关concurrent的具体使用我们将分10节来实例说明。


       二、Android Bitmap平移操作如何实现

  有网友问Android系统下如何实现Bitmap向某方向平移操作,有关图片旋转操作可以查看 , 对于平移我们可以通过Canvas类的public void translate (float dx, float dy) 方法来实现,参数一为平面x轴的位置,类型为浮点型,参数二为y轴的位置。不使用Matrix类,我们可以直接构造一个空的Bitmap对象,通过 Canvas类提供的drawBitmap方法画出我们需要的Bitmap对象,然后调用translate方法来实现平移,比如将位图向右平移2个像 素,可以为translate(2,0) 而向下移动3个像素translate(0,-3)


      三、如何强制禁用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,详细的参数声明如下:
  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. final static int  getSelectionStart(CharSequence text)
  4. Return the offset of the selection anchor or cursor, or -1 if there is no selection or cursor.

  5. final static void  removeSelection(Spannable text)
  6. Remove the selection or cursor, if any, from the text.

  7. final static void  selectAll(Spannable text)
  8. Select the entire text.

  9. final static void  setSelection(Spannable text, int index)
  10. Move the cursor to offset index.

  11. static void  setSelection(Spannable text, int start, int stop)
  12. Set the selection anchor to start and the selection edge to stop.
复制代码

eoe社区提示大家,从上面的参数来看,可以发现Spannable类型,常规我们的EditText中的编辑中Editable直接实现Spannable接口,所以我们可以通过下面的方法来设置选择:
  1. Editable ea= etEdit.getText();  //etEdit为EditText
复制代码

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 来执行安装。
  1. Intent intent = new Intent(Intent.ACTION_VIEW);
  2.   intent.setDataAndType(Uri.parse("file://"+ "/sdcard/android123.com/cwj.apk","application/vnd.android.package-archive");
  3.   startActivity(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平台底层库很多地方做的不近人如意,很多关键地方都出现了问题。
阅读(1473) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~