2012-04-17 12 views
0

ネットワークサーバーにいくつかの「ピンポン」を前後に問い合わせる関数が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(); 
    } 
} 

答えて

0

ハンドラの素晴らしい点は、UIスレッドに限定されていないことです。ハンドラが1つのスレッドで宣言されている場合は、それを設定できますことができます...私はあなたの問題に完全にオフベースだなら、私は危険なコードの

+0

ありがとう@JRaymond、私が抱えている問題は、実際には "タイマータスクでLooper.prepare()を呼び出していないスレッド内のハンドラを作成できません"というクラッシュです。 Timer内からthreadedPoll()が呼び出された直後に、上記がトリガされます。 私は完全にタイマーをスキップし、onCreateで "testThread(asciiQueries、WorkerThreadRunnable.typeLogin)"を実行すると、カスタム実行可能/ハンドラの組み合わせが機能します。それはタイマーによって呼び出されているので、それを殺している – Octoth0rpe

+0

@ Octoth0rpeああ...私は、あなたのタイマースレッドがハンドラを宣言しようとしているからだと思う - それはハンドラのために設定されたスレッドではない。どのスレッドがハンドラのコンストラクタを呼び出すのかは、ハンドラが結び付けられているスレッドです。その代わりにワーカースレッドでそのコンストラクタを呼び出す方法を見つけたり、独自のタイマースレッドをロールバックしたりできます。 – JRaymond

0

sleep()ループでワットが間違っていますか?なぜあなたは1つのスレッドでループするだけで複雑な、厄介なコードのページを持っていますか?

+0

WOTのpagefulsを知っているように別のスレッド

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

願わくばからの非同期の指示を取るには?私を信じて、このアプリがやっていることは合理的です。あなたがここに目にしているのは、複雑さの表面をほとんど傷つけないことです。 (私はAsyncTaskから完全に離してしまったので、さまざまなアクティビティから同じ関数にアクセスする必要があり、AsyncTaskはメンテナンスが醜く困難になるでしょう)。 また、すべてのASCII通信が前後して行われるため、カスタムハンドラが必要です。 – Octoth0rpe