Android学习笔记_03 - Service应用测试(续)
在Service里通过Runnab线程调用Thread线程
在上篇实现了Service及在Service里调用Runnable线程,通过试验发现了在Runnable线程里执行长时间延时循环时出现的问题。
由于增加的功能很简单,所以直接上代码。其实在上次工程的基础上做点简单的修改,在Runnable里加了一个Thread线程。
1、 代码实现
1)、增加一个从Thread继承过来的新类,取名为:WorkThread,意思是工作线程。
publicclass WorkThread extends Thread {
publicvoid run() {
//此段可以写线程里想做的任何工作了
Log.d(TAG," WorkThread Run!");
delay(1000);// 我测试了,这个参数相当于30秒的延时,程序也没假死,也没产生异常
}
}
2)、定义WorkThread类的实例变量
WorkThread mWorkThread = null;
3)、修改timerThread 里的执行代码,修改后的代码如下:
Runnable timerThread = newRunnable(){
publicvoid run(){
Log.v(TAG,"TimerOnTimer");
if((mWorkThread == null)||(!(mWorkThread.isAlive()))){
mWorkThread= new WorkThread();
mWorkThread.start();
}
handler.postDelayed(timerThread, 1000);
}
};
2、 运行测试
运行程序后,可以通过LogCat来查看程序输出:
注意看上图,红色框子里选择的是verbose,字面上是“啰嗦”的意思,就是所有的输出消息都会显示,TimerService的定时消息输出时用的是Log.v(),所以会显示出来,同时Log.d()的输出当然也会显示出来。从上图可以看出,TimerService的定时时间约为1秒,一直以1秒间隔输出LogCat消息,同时每秒检查一次mWorkThread的状态,如果为空或者没有在活动状态,说明线程运行结束,就创建一个新的线程,代码里新建线程的作用就是运行30秒的延时代码而已。请注意:如果在主线程里循环超过5秒以上,就有可能出现“无响应”异常哦。
上图红框里选择的是debug,就是debug级别以上的消息都会输出,由于Verbos级别低于Debug,所以不会输出,从上图可以看到,mWorkThread里面的延时函数循环延时时间30秒左右,但主程序都正常运行呢。
狂点按钮“点我”,计数增加很正常,没有丝毫延迟。从上面的例子可以看到,此法实现的线程应用,可以应对线程里长时间不响应的应用场合。实际项目中,可以针对每个具体应用建立不同的线程类,比如下载、上传、数据查询等,既可以单个执行,也可以同时执行,达到了我的项目应用要求。
示例源码:Android学习笔记_03 - Service应用测试(续)