0

我有一个函数可以来回查询带有几个“乒乓球”的网络服务器,并编写了一个自定义处理程序来处理我的主 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();
    }
}
4

2 回答 2

0

sleep() 循环有什么问题吗?当你可以在一个线程中循环时,为什么会有大量复杂、狡猾的代码?

于 2012-04-17T00:27:41.763 回答
0

你似乎已经在路上了——不过,处理程序的好处是它们不限于 UI 线程——所以如果你有一个由一个线程声明的处理程序,你可以将它设置为接受异步指令从另一个线程

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-17T00:30:10.967 回答