ネットワークサーバーにいくつかの「ピンポン」を前後に問い合わせる関数が1つあり、メインのUIスレッドと(私はAsyncTaskを使用していましたが、プログラムが複雑になるにつれて、主な活動の外で独自のクラスに通信コードを削除することに決めました)。Androidインセプション(スレッド内のスレッド)
onCreateからのこのスレッド通信の1つのインスタンスをトリガすることは、問題なく動作します。 このクエリは、定期的に(バックグラウンドで)アプリケーションが使用されている間、実行されるので、私はpollTimerという別のスレッドを設定しました。他のスレッドは定期的にスケジュールされています。 明らかに、クラッシュしている、または私はこれを投稿していないだろう。
スレッド内にスレッドを取得する方法はありますか?別の言い方をすると、別のスレッドからスレッドをトリガーしますか?
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);
}
編集:それはおそらくのonCreateから呼び出されたときに、それ自体で働く「testThread」機能を含むように役立つだろうが、タイマーから呼び出されたときにそれを作ることはありません。 "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();
}
}
ありがとう@JRaymond、私が抱えている問題は、実際には "タイマータスクでLooper.prepare()を呼び出していないスレッド内のハンドラを作成できません"というクラッシュです。 Timer内からthreadedPoll()が呼び出された直後に、上記がトリガされます。 私は完全にタイマーをスキップし、onCreateで "testThread(asciiQueries、WorkerThreadRunnable.typeLogin)"を実行すると、カスタム実行可能/ハンドラの組み合わせが機能します。それはタイマーによって呼び出されているので、それを殺している – Octoth0rpe
@ Octoth0rpeああ...私は、あなたのタイマースレッドがハンドラを宣言しようとしているからだと思う - それはハンドラのために設定されたスレッドではない。どのスレッドがハンドラのコンストラクタを呼び出すのかは、ハンドラが結び付けられているスレッドです。その代わりにワーカースレッドでそのコンストラクタを呼び出す方法を見つけたり、独自のタイマースレッドをロールバックしたりできます。 – JRaymond