いくつかの「ピンポン」を行ったり来たりしてネットワーク サーバーにクエリを実行する 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();
}
}