在我的黑莓应用程序中,我使用备用入口点并在启动时运行一个执行http操作的线程,并在一段时间之后重复调用相同的线程让我们说3分钟。它完成了它的操作,但问题是它挂起了ui 这是我的代码。
final class sendUnsentService extends Thread {
Timer timer;
TimerTask repeatMe;
sendUnsentService me;
boolean working = false;
public boolean isWorking() {
return working;
}
public void interrupt() {
super.interrupt();
System.out.println("___________________________[STOPSERVICE()]");
try {
timer.cancel();
} catch (Exception e) {
System.out
.println("_______________________[PROBLEM STOPPING SERVICE]");
}
}
public void run() {
super.run();
System.out.println("___________________________[STARTSERVICE()]");
new Thread() {
public void run() {
timer.schedule(repeatMe, 0, 300000);
};
}.start();
}
public sendUnsentService() {
me = this;
ImageUtils.initPersistentStorage();
timer = new Timer();
repeatMe = new TimerTask() {
public void run() {
working = true;
if (sendUnsentActivity()) {
me.interrupt();
}
working = false;
}
};
}
我使用此代码在某些用户交互上调用此线程,然后挂起ui
try {
helloBerry.service = new sendUnsentService();
} catch (Exception e) {
System.out.println("_____________1 " + e);
}
try {
helloBerry.service.startService();
} catch (Exception e) {
System.out.println("_____________2 " + e);
}
这就是我在主方法中使用备用入口点
调用服务启动设备启动的方法if (args != null && args.length > 0 && args[0].equals("normal")) {
System.out.println("_________[STARTING APP]");
___________some code here to show a screen
}
} else {
System.out.println("_________[STARTING SERVICE]");
service = new sendUnsentService();
service.run();
}
答案 0 :(得分:1)
我注意到的第一件事是你从另一个Thread开始一个TimerTask。 Timer包含自己的Thread,所以这是不必要的 - 只需直接调用它。另外,我认为你不需要扩展一个Thread。您可能想要做的是使用TimerTask重新安排自己,如果它没有错误,否则只是让它停止。
至于锁定UI,除非你在RuntimeStore上做一些奇怪的同步,否则这不应该影响你的主程序。它应该作为两个独立的进程运行,彼此不知道。它冻结在什么情况下?
答案 1 :(得分:0)
OMG!最后我发现了这个问题和它的那种愚蠢问题是我用来打印数据的一些sysout语句我发送到服务器谢谢你jprofit感兴趣
我有另一个与此相关的问题,如果你能回答我在一些事件上启动这个线程,所以当用户关闭应用程序时它也关闭这个线程我试过扩展应用程序而不是线程但我无法处理它远程的。