2011-07-13 35 views
5

Looperprepare()/loop()/quit()ロジックの使い方を理解するのに少し問題があります。AndroidでLooper.prepare()を使用する際の詳細

私は3つのスレッドを持っています:1つはUIスレッド、もう1つはゲームロジックスレッドで、最後はネットワーク通信スレッドです(バックグラウンドスレッドは使用中にのみ存在します)。

ゲームスレッドはネットワークコールの結果に多くの依存関係がありますので、ゲームスレッドからネットワークスレッドを外して結果を返信したいのですがHandlerが返されます。

もちろん、UIスレッドが含まれていないので、Looper.prepare() ...どこかに電話する必要があります。私はそれをゲームスレッドで呼び出すべきだと思ったが、loop()がそれを引き継ぐので、私はそれを行うことができない。

ハンドラを使用してネットワークスレッドからゲームスレッドにポストバックする方法を教えてください。何が起こっている

答えて

7

はあなたがスレッド上Looper.prepare()Looper.loop(続く)を呼び出した後、すべてそのスレッドがこれまでが行うということです誰かがそのルーパー上)(終了呼び出すまでのサービスにそのメッセージキューです。

実現するために、他の事はハンドラがインスタンス化されるときにデフォルトで、それはコードは常にそれはあなたが何をすべき

で作成されたスレッド上で実行されますだ、ということです(新しいスレッドを作成し、実行しています)Looper.prepare()を呼び出し、ハンドラを設定してからLooper.loop()を呼び出します。

ここではこれらのことを念頭において、私は多くの場所を使用する基本パターンです。また、代わりにAsyncTaskを使用するだけでよいでしょう。

public class NetworkThread extends Thread { 
    private Handler mHandler; 
    private Handler mCallback; 
    private int QUIT = 0; 
    private int DOWNLOAD_FILE = 1; 
    public NetworkThread(Handler onDownloaded) { 
     mCallback = onDownloaded; 
    } 

    public void run() { 
     Looper.prepare(); 
     mHandler = new Handler() { 
      @Override 
      public void handleMessage(Message msg) { 
       switch (msg.what) { 
        // things that this thread should do 
        case QUIT: 
         Looper.myLooper().quit(); 
         break; 
        case DOWNLOAD_FILE: 
         // download the file 
         mCallback.sendMessage(/*result is ready*/); 
       } 
      } 
     } 
     Looper.loop(); 
    } 

    public void stopWorking() { 
     // construct message to send to mHandler that causes it to call 
     // Looper.myLooper().quit 
    } 

    public void downloadFile(String url) { 
     // construct a message to send to mHandler that will cause it to 
     // download the file 
    } 
} 
0

ネットワークスレッドを使用しているものの例を教えてください。私はルーパーを使わずに問題を解決できると思います。

ASyncTaskを使用して、UIスレッドの一部の値を更新するバックグラウンドタスクを実行できます。バックグラウンド操作が完了するまでユーザーが待機する必要がある場合は、ProgressDialogを表示し、OnPreExecuteメソッドでアプリケーションをブロックし、onPostExecuteで非表示にできます。

私が言ったように、より多くのあなたのニーズと達成したい目標を記述してください。

関連する問題