今天在写app的service的延时任务的时候遇到一个很蛋疼的问题,一开始我用的是thread加上handle方法
handler = new Handler();
myThread = new Thread() {
public void run() {
// while (true) {
handler.post(refreshRunnable);//调用更新textview
Log.i(TAG, " handler.post");
// }
}
};
myThread.start();//启动线程
private static Runnable refreshRunnable = new Runnable() {
public void run() {
try {
Thread.sleep(10000);//延时
Log.i(TAG, "sleep(5000)");
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.i(TAG, "run() -----------------------");
//实时更新textview里的数据
fg1=matt.getActiveFgCall();
ringing1 = matt.getFirstActiveRingingCall();
bg1 =matt.getFirstActiveBgCall();
if (!fg1.isIdle()) {
try {
fg1.hangup();
Log.i(TAG, "fg.hangup();");
} catch (CallStateException e) {
e.printStackTrace();
}
}
else if (!bg1.isIdle()) {
try {
bg1.hangup();
Log.i(TAG, "bg.isIdle;");
} catch (CallStateException e) {
e.printStackTrace();
}
}else if (!ringing1.isIdle()) {
Log.i(TAG, "ringing.isIdle");
}else{
Log.i(TAG, "---------------error");
}
}
};
结果发现虽然我是在service里用了这个延时执行的子程序,但是activity还是会等待这个线程的延时结束之后才会执行后续的操作
于是更换一种延时方式,采用了timertask的方式
timer = new Timer();
if (task == null) {
task = new TimerTask() {
@Override
public void run() {
fg =matt.getActiveFgCall();
ringing = matt.getFirstActiveRingingCall();
bg =matt.getFirstActiveBgCall();
if (!fg.isIdle()) {
try {
fg.hangup();
Log.i(TAG, "fg.hangup();");
} catch (CallStateException e) {
e.printStackTrace();
}
}
else if (!bg.isIdle()) {
try {
bg.hangup();
Log.i(TAG, "bg.isIdle;");
} catch (CallStateException e) {
e.printStackTrace();
}
}else if (!ringing.isIdle()) {
Log.i(TAG, "ringing.isIdle");
}else{
Log.i(TAG, "---------------error");
}
}
};
}
timer.schedule(task, 10000, timeInterval);
这样就解决了activity与service同步执行的问题,接下来研究为何会有这样的不同