android 源码问题解答(异常处理)

case1:如何做到按back键不退出应用后台继续运行?

在基类activity会调用onBackPressed这个方法,这个方法会finish当前这个activity,使得当前activity走到onDestory,如果想要按back键不走到onDestory,需要复写onBackPressed方法

@Overridepublic void onBackPressed() {// TODO Auto-generated method stub// super.onBackPressed(); moveTaskToBack(true);}

调用moveTaskToBack(true),让任务在后台执行,与按home键的效果一样case2:android调试如何获得时间差1,引用如下命名空间:import java.util.Date;import android.text.format.DateFormat;2,设置时间格式:SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");3,获取时间:Date curDate = new Date(System.currentTimeMillis()); //PROCESSINGDate endDate = new Date(System.currentTimeMillis());long diff = endDate.getTime() – curDate.getTime();这样获取的就是时间间隔了,并且是ms级别的,通过log就可以打印出来

case3:listview如何在显示的时候默认跳转到最后一条记录开始的地方而不是结尾?

系统中listview显示很多条数据时,或者一条数据过长时,比如超过整个屏幕的高度,那么显示的时候就会自动跳转到最后一条数据的结尾,这是由属性transcriptMode来控制的

属性所用到值及意义为:

disabled 0 Disables transcript mode. This is the default value.

normal 1 The list will automatically scroll to the bottom when a data set change notification is received and only if the last item is already visible on screen.

alwaysScroll 2 The list will automatically scroll to the bottom, no matter what items are currently visible.

但是我们如果想要滚动,又不想让它跳转到最后一条记录开始的地方就要在代码中设置如下:

mListView.setSelection(listviewAdapter.getCount())

另外用transcriptMode属性的默认值即disabled

case4:在浏览器中反复测试同一问题有时会出现"浏览器停止运行"?比如说不断的添加书签,不断的点播视频等等

1.问题分析

出现这种问题一般会在main.log中打印如下trace:

11-19 06:00:46.570 880 1870 E CursorWindow: Could not allocate CursorWindow ‘/data/data/com.android.browser/databases/browser2.db’ of size 2097152 due to error -24

这代表是FD超标了,android中fd的数量上限为1024,超过此数目,就会报上述异常。

也可以用下述命令进一步确认是否是fd超标及哪些文件句柄超标:

adb shellps | busybox grep com.android.browser得到 pidlsof | busybox grep pid

用busybox命令必须保证是在userdebug版本而非user版本

如果发现用上述命令得到fd的数量很大,而且有不断递增的趋势,一般超过300就认为是异常了,最高不会超过1024

2.问题定位

首先是排查自己添加的代码有无fd泄漏,比如cusros没有关闭或者关闭异常,thread执行关闭没有释放,这些是最常见的fd超标。

确认自己的代码没问题,怀疑是平台的问题,就可以把log及browser代码提交给展讯来分析了。

caes5:在android中,常见的任务延迟怎么实现呢?

1.最常见的就是用thread了,一般为:

new Thread(new Runnable(){ public void run(){ Thread.sleep(n); handler.sendMessage();//去告诉主线程可以开始工作了 } }).start

2.用handler来实现

new Handler().postDelayed(new Runnable(){public void run(){ //做你想做的事}}, delay);

3.用timer来实现

timer = new Timer(true);timerTask = new TimerTask() {public void run() { //做你想做的事}};timer.schedule(timerTask, delay);

这三种方式是我们经常用到的。

4.用定时器AlarmManager来实现,我们经常用到的日历和闹钟就是主要用到了这个服务;主要功能就是在特定的时刻为广播一个指定的Intent;简单的说就是我们设定一个时间,然后在该时间到来时,AlarmManager为我们广播一个我们设定的Intent

case6:如何衡量代码性能?

Java和Android提供了以下的API,让应用可以测量时间及性能:

System.currentTimeMillis

System.nanoTime

Debug.threadCpuTimeNanos

SystemClock.currentThreadTimeMills

SystemClock.elapsedRealtime

SystemClock.uptimeMillis

以上函数即使有些方法返回时间用纳秒表示,并不意味着精度是纳秒级的。实际精度取决于平台。毫秒精度的一样的道理。

测试时间的典型代码:

long startTime = System.nanoTime();

//待测代码

long duration = System.nanoTime() – startTime;

这段代码全引用的java类,因此可以用在Android以外的平台。而Debug和SystemClock类是Android独有的。

尽管System.currentTimeMillis()可以作为测量时间的手段,但不建议使用这种方法,原因如下:

1)其精度和准确度不够

2)更改系统时间会影响其结果

明天的希望,让我们忘了今天的痛苦

android 源码问题解答(异常处理)

相关文章:

你感兴趣的文章:

标签云: