我有一个函数可以来回查询带有几个“乒乓球”的网络服务器,并编写了一个自定义处理程序来处理我的主 UI 线程和通信线程之间的消息通信(我为此使用 AsyncTask,但作为程序变得更加复杂,我决定将通信代码删除到主要活动之外的自己的类中)。
从 onCreate 触发此线程通信的单个实例可以完美地工作,没问题。我希望这个查询在应用程序使用的整个时间内定期运行 - 在后台 - 所以我设置了另一个名为 pollTimer 的线程,我试图用它来调用 OTHER定期安排线程。显然,它崩溃了,否则我不会发布这个。
有没有办法在线程中获取线程?或者换一种说法,从另一个线程触发一个线程?
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 调用时自行工作,但在从 Timer 调用时不起作用。“WorkerThreadRunnable”是它自己的类中的大量代码,它取代了让 AsyncTask 在主要活动中处理它的混乱。
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();
}
}