0

いくつかの「ピンポン」を行ったり来たりしてネットワーク サーバーにクエリを実行する 1 つの関数があり、メイン UI スレッドと通信スレッド間のメッセージ通信を処理するカスタム ハンドラーを作成しました (これには AsyncTask を使用していましたが、プログラムがより複雑になったため、通信コードをメイン アクティビティの外の独自のクラスに削除することにしました)。

onCreate からこのスレッド通信の 1 つのインスタンスをトリガーすると、問題なく完全に機能します。このクエリを定期的に (バックグラウンドで) アプリの使用中ずっと実行したいので、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() ループが間違っていますか? 1 つのスレッドでループできるのに、複雑で怪しげなコードがページいっぱいにあるのはなぜでしょうか。

于 2012-04-17T00:27:41.763 に答える
0

あなたはすでに順調に進んでいるようです - ただし、ハンドラーの良いところは、ハンドラーが UI スレッドに限定されないことです - したがって、1 つのスレッドによって宣言されたハンドラーがある場合は、非同期命令を受け取るようにセットアップできます。別のスレッドから

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 に答える