2010-08-02 34 views
17

Kullanıcı belirli düğmeleri tıklattığında HTTP İstekleri (özellikle FogBugz API'yi çağırıyor) gerçekleştiren bir uygulamam var. Şu anda, yalnızca uygulama başladığında bir hizmet oluşturuyorum ve istekleri tamamlamak için bu hizmette farklı yöntemler çağırıyorum. Ancak, bunu yaptığımda, UI iş parçacığında olağan bir askıda bulunur. AsyncTask'a baktım, ancak gerçekleştirmek istediklerimi yapacağından emin değilim. HTTP İsteği'nin döndürdüğü XML'yi anında ayrıştırmam gerektiğinden, bu verileri UI iş parçacığına döndürebilen bir işlem olması gerekir. ASyncTask bunu başarabilecek mi, yoksa başka bir yolu var mı?http istekleri gerçekleştirmek için ayrı iş parçacığı nasıl kullanılır?

public static InputStream makeRequest(String httpRequest) 
    { 
     In a separate thread, run HTTP Request, get back and process, return inputstream 
    } 

Bu yöntem, HttpRequest'leri gerçekleştirmek için başkaları tarafından çağrılır. Giriş akışı döndüğünde, diğer yöntemler belirli bilgiler için ayrıştırılır.

cevap

59

sadece run() yöntemi içinde kod yürütme yeni bir iş parçacığı içinde yürütülecek neden olacaktır

//Body of your click handler 
Thread thread = new Thread(new Runnable(){ 
    @Override 
    public void run(){ 
    //code to do the HTTP request 
    } 
}); 
thread.start(); 

gibi bir şey yapmak olacaktır yapmanın en kolay yolu. Eğer kişisel olarak hiç kullanmamamıza rağmen bir uyumsuzluk görevine bakabilirsiniz. Bu, işleri halletmenin hızlı ve basit bir yoludur.

Geri bilgi aktarımıyla ilgili olarak, belirli bir iş parçacığı için bir ileti kuyruğu ayarlamanıza ve belirli kodun yürütülmesine neden olan iletilere iletmenize olanak tanıyan bir Handler object kullanırdım. Bunun nedeni, Android'in UI iş parçacığı dışındaki herhangi bir iş parçacığının gerçek kullanıcı arabirimini güncellemesine izin vermemesidir.

Sorunuzu giderir mi? İlk geçişimin tüm sorunlarınızı tamamen çözmediğini biliyorum.

Düzenleme Temelde, ne yapmak da ne yapacağını işleyici anlatmak statik int sabitler oluşturmak

private Handler handler_ = new Handler(){ 
    @Override 
    public void handleMessage(Message msg){ 

    } 

}; 

gibi senin Activity bir işleyici nesnesi tanımlamaktır. Temel olarak, bir işleyicinin bir örneğine iletilecek farklı türde iletilere izin vermek için bunları kullanırsınız. Sadece geri gönderilen bir mesaj olacaksa, bunun için endişelenmenize gerek yok. inputStreamInstance Message eklenir Alternatif

private Handler handler_ = new Handler(){ 
    @Override 
public void handleMessage(Message msg){ 
    switch(msg.what){ 
      case UPDATE_UI: 
      InputStream is = (InputStream)msg.obj; 
      //do what you need to with the InputStream 
      break; 
     } 
    } 

}; 

, örneğin:

private static final int UPDATE_UI = 1; 

için

Eğer işleyicisi itibaren

handler_.sendMessage(Message.obtain(handler_, UPDATE_UI, inputStreamInstance)); 

çağrı işleyicisi bir mesaj göndermek için Nesne, onu ayrıştırmak istediğinizde istediğiniz herhangi bir nesneyi geçirebilirsiniz. Bir çeşit konteynır nesnesine veya bunun gibi bir şeye, bunu da yapabilirdiniz. Sadece işleyiciden o nesneye geri gönderin.

+0

teşekkür içindeki http isteği için programı yazın. Ayrı iş parçacığından bilgi gönderip alma konusunda hala sorun yaşıyorum. Sorumu, umarım ne yapmam gerektiğini açıklığa kavuşturmak için güncelledim. İşleyici nesnesine ilişkin olarak, ikincil iş parçacığında, örneğin giriş akışı gibi geri bilgi iletmek için kullanabilirim? – mbauer14

4

AsyncTask kullanmayı deneyin.Goto fazlası için bu Link:

private class SyncIncoData extends AsyncTask<String, String, String> { 
    ProgressBar pb; 
    ProgressBar pbar; 

    @Override 
    protected String doInBackground(String... urls) { 
     for (int i = 0; i <= 100; i++) { 
      publishProgress(i); 
     } 
     return null; 
    } 

    @Override 
    protected void onPreExecute() { 

     super.onPreExecute(); 

     pb = (ProgressBar) findViewById(R.id.progressBarsync4); 
     pb.setVisibility(View.VISIBLE); 

    } 

    @Override 
    protected void onPostExecute(String result) { 

     pb = (ProgressBar) findViewById(R.id.progressBarsync4); 
     pb.setVisibility(View.INVISIBLE); 

    } 

    @Override 
    protected void onProgressUpdate(String... values) { 
     pbar = (ProgressBar) findViewById(R.id.progressBarpbar); 
     pbar.setProgress(Integer.parseInt(values[0])); 
     super.onProgressUpdate(values); 
    } 
} 

yardım doinbackgroud()

İlgili konular