我有一个用几个“乒乓”来回查询网络服务器的函数,并编写了一个自定义处理程序来处理我的主UI线程和通信线程之间的消息通信(我使用AsyncTask来完成这项工作,但随着程序变得越来越复杂,我决定在主活动之外将通信代码删除到它自己的类中)。
从onCreate触发此线程通信的单个实例可以很好地工作,没有问题。我希望此查询在应用程序使用的整个时间内定期在后台运行,因此我设置了另一个名为pollTimer的线程,我正尝试使用它定期调用另一个线程。很明显,它崩溃了,否则我就不会发这篇文章了。
有没有一种方法可以在线程中获取线程?或者换句话说,从另一个线程触发线程?
Timer pollTimer = new Timer();
private void startPollTimer(){
pollTimer.scheduleAtFixedRate(new TimerTask(){
public void run(){
Log.d(TAG,"timer dinged");
//if the following is commented out, this "dings" every 6 seconds.
//if its not commented out, it crashes
threadedPoll();
}
}, 3120, 6000);
}
private void threadedPoll() {
testThread(asciiQueries,WorkerThreadRunnable.typeLogin);
}编辑:包含"testThread“函数可能会有所帮助,该函数在从onCreate调用时自动生效,但在从计时器调用时不会生效。"WorkerThreadRunnable“是它自己的类中的大量代码块,它取代了让AsyncTask在main activity中处理它的混乱。
private Handler runStatHandler = null;
Thread workerThread = null;
private void testThread(String[] threadCommands, int commandType){
if(runStatHandler == null){
runStatHandler = new ReportStatusHandler(this);
if(commandType == WorkerThreadRunnable.typeLogin){
workerThread = new Thread(new WorkerThreadRunnable(runStatHandler,threadCommands, WorkerThreadRunnable.typeLogin));
}
workerThread.start();
return;
}
//thread is already there
if(workerThread.getState() != Thread.State.TERMINATED){
Log.d(TAG,"thread is new or alive, but not terminated");
}else{
Log.d(TAG, "thread is likely deaad, starting now");
//there's no way to resurrect a dead thread
workerThread = new Thread(new WorkerThreadRunnable(runStatHandler));
workerThread.start();
}
}发布于 2012-04-17 08:30:11
您似乎已经准备好了--不过,处理程序的好处是它们并不局限于UI线程--所以如果您有一个由一个线程声明的Handler,那么您可以将其设置为从另一个线程接收异步指令
mWorkerThread = new WorkerThread()
private class WorkerThread extends Thread {
private Handler mHandler;
@Override
public void run() {
mHandler = new Handler(); // we do this here to ensure that
// the handler runs on this thread
}
public void doStuff() {
mHandler.post(new Runnable() {
@Override
public void run() {
// do stuff asynchronously
}
}
}
}希望这能帮上忙。如果我对你的问题完全错了,请告诉我
发布于 2012-04-17 08:27:42
使用sleep()循环有什么问题吗?当你可以只在一个线程中循环时,为什么你会有一页又一页的复杂,不可靠的代码呢?
https://stackoverflow.com/questions/10183391
复制相似问题