Android Inception(线程中的一个线程)

时间:2012-04-17 00:11:36

标签: android multithreading timertask

我有一个功能,用一些" 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();
    }
}

2 个答案:

答案 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
      }
    }
  }
}

希望这有帮助...如果我完全不基于您的问题,请告诉我