我有一个功能,用一些" ping pongs查询网络服务器"来回,并编写了一个自定义处理程序来处理我的主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" function,从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();
}
}
答案 0 :(得分:0)
睡眠()循环错误?当你可以在一个线程中循环时,为什么你有一些复杂的,狡猾的代码?
答案 1 :(得分:0)
你似乎已经很好了 - 但是处理程序的优点是它们不仅限于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
}
}
}
}
希望这有帮助...如果我完全不基于您的问题,请告诉我