安卓开发问题集锦二

问题一 、MATCH_PARENT  是什么类型的布局 ?
    有网友表示对于很多工程中的 MATCH_PARENT 出现在 layout 中感到不明白,过去只有 FILL_PARENT和WRAP_CONTENT 那么 match_parent 到底是什么类型呢? 其实从 Android 2.2 开始 FILL_PARENT 改名为MATCH_PARENT ,从 API Level 为 8 开始我们可以直接用 MATCH_PARENT 来代替 FILL_PARENT,最后提醒大家,他们的定义本质是一样均为-1,只是换了个别名。
问题二 、View的显示状态GONE,VISIBLE和INVISIBLE区别
    很多网友可能会发现 View类的设置显示状态 setVisibility方法有三种情况,分别为 GONE、VISIBLE和INVISIBLE,它们之间到底有哪些区别呢? 举个简单的例子。有些Android应用的下面包含广告条,如果这个View我们设置为 GONE 则消失,该广告条看不见也不占用位置。而INVISIBLE则代表广告条那块是空白,但仍然占着布局高和宽的位置,而 VISIBLE 就是标准显示时的状态。
问题三 、android单实例运行方法
    我们都知道 Android 平台没有任务管理器,而内部 App维护者一个 Activity history stack 来实现窗
口显示和销毁,对于常规从快捷方式运行来看都是startActivity可能会使用 FLAG_ACTIVITY_NEW_TASK 标
记来打开一个新窗口,比如 Launcher,所以考虑单任务的实现方法比较简单,首先纠正大家一种错误的方法就是直接在 android manifest.xml的application节点中加入android:launchMode="singleInstance"这句,其实这样将不会起到任何作用,Apps内部维护的历史栈作用于 Activity,我们必须在 activity 节点中加入 android:launchMode="singleInstance" 这句才能保证单实例,当然一般均加在主程序启动窗口的 Activity。
问题四 、ListView和ScrollView同时使用Bug
     ListView 或 ScrollView 这样的组件放在一起套嵌会出现无法正常显示的 bug,比如典型的例子就是ScrollView中包含的ListView只能显示2行左右,而ListView中的数据肯定远大于2个,这样的问题推荐大家可以通过重写ListView的onMeasure方法来重新设置控件的显示高度,在onMeasure 中我们使用setMeasuredDimension方法重新设置控件的显示尺寸。同样对于部分网友提到的水平滚动 ListView 仍然适用,当然可能还有一部分网友可能使用 HorizontalScrollView 来实现。
问题五 、Android的Btimap处理大图片解决方法
    我们都知道 Android 的 Dalvik VM 为一个应用提供了大约 16MB 的内存,一般我们处理超过 8MB 的图片将会出现 OutOfMemoryError 异常,我们解码一个图片为了防止内存不足的异常我们可以使用BitmapFactory.Options 的 udeinTempStorage 属性解决,代码如下:
1.BitmapFactory.Options cwj = new BitmapFactory.Options();
2.cwj.inTempStorage = new byte[1024*1024*5]; //5MB 的临时存储空间
3.Bitmap bm = BitmapFactory.decodeFile(inputStream,cwj); //这里 cwj 为 Options 属性
问题六、android下解析xml文件遇到中文问题
    很多 Android 开发者可能一直抱怨 xml 解析库不够完善,对于国内很多 server 并不是标准的 utf-8 编
码,遇到中文时可能解析器会停止或解析出来的是乱码。这里 Tony 给大家说下常见的解决方法:
    (一)、android sax 库遇到 gbk 或 gb2312 编码时
    方法 1. 可以显示的指明编码比如:
      (1)InputSource is = new InputSource(inputStream);
      (2)is.setEncoding("UTF-8");
    方法 2. 使用 InputStreamReader 转换
    在 SDK中可以查看有这样实例化方法,参数二为字符集 InputStreamReader(InputStream in, Charset charset) 具体使用可以是InputSource is=new InputSource(newInputStreamReader(inputStream,"gb2312"));
    有关 InputSource 的细节,我们遵循 如果有字符流可用,则解析器将直接读取该流,而忽略该流中找到的任何文本编码声明。如果没有字符流,但却有字节流,则解析器将使用该字节流,从而使 用在InputSource 中指定的编码,或者另外(如果未指定编码)通过使用某种诸如 XML 规范 中的算法算法自动探测字符编码。如果既没有字符流,又没有字节流可用,则解析器将尝试打开到由系统标识符标识的资源的 URI 连接 。
    (二)、推荐大家尽量在服务器上配置使用 utf-8 编码,虽然显示英文字符较为两非,但是兼容性是最好的,也是国际最主流的标准。
问题七、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.这里要提醒的是下面这句 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(newFile(sfileFullPath))。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值