2011-07-13 16 views
5

Looperprepare()/loop()/quit() mantığını nasıl kullanacağımı anlamakta zorluk çekiyorum.Android'de Looper.prepare() işlevinin kullanımıyla ilgili ayrıntılar

Üç iş parçacığım var: biri UI iş parçacığı, bir oyun mantığı iş parçacığı ve sonuncu ağ iletişim iş parçacığı (arka plan iş parçacığı, yalnızca kullanılmakta olduğunda yaşıyor).

Oyun dizisinin ağ aramalarının sonuçlarına bağlı pek çok bağımlılığı var, bu yüzden ağdaki ipliği oyun ipucundan çıkarmak ve sonucu geri almak için Handler numarasına sahip olmak istedim.

Tabi ki, kullanıcı arayüzü iş parçacığı olmadığı için, Looper.prepare() ... 'u aramalıyım. Oyun dizisinde çağrılması gerektiğini düşündüm ama bunu yapamam çünkü loop() bunu üstleniyor.

İşleyicim ile ağ iş parçacığından oyun dizisine geri gönderme hakkında nasıl gidebilirim?

cevap

7

Neler oluyor bir Konu üzerinde Looper.loop ardından Looper.prepare()() çağrısı bir kez birisi onun Lüper üzerinde() çıkmak aramaları kadar hiç yapacak tüm bu Konu hizmetin MessageQueue olmasıdır.

gerçekleştirmek için başka bir şey (bir Handler örneği varsayılan olarak, bu kod her zaman Yapmanız gereken yeni bir iş parçacığı oluşturmak olduğunu

ve vadede oluşturulduğu Takip üzerinde çalıştırır, budur) Looper.prepare() öğesini çağırın, İşleyicileri kurun ve sonra Looper.loop() öğesini çağırın.

Burada akılda tutulması gerekenler burada çok fazla yer kullandığım temel kalıptır. Ayrıca, bunun yerine sadece AsyncTask kullanmanızın iyi bir şansı var.

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

Ağ iş parçacığını ne kullandığınıza dair örnekler verebilir misiniz? Looper kullanmadan problemlerinizi çözebileceğinizi düşünüyorum.

UI iş parçacığındaki bazı değerleri güncelleyebilecek arka plan görevini gerçekleştirmek için ASyncTask'u kullanabilirsiniz. Kullanıcı arka plan işlemi bitene kadar beklemek zorundaysa, ProgressDialog gösterebilir ve OnPreExecute yönteminde uygulamayı engelleyebilir ve sonra onPostExecute içinde gizleyebilirsiniz.

Söylediğim gibi, lütfen daha fazla ihtiyaçlarınızı tanımlayın ve ulaşmak istediğiniz hedefleri belirtin.

İlgili konular