6

AsyncTask sınıfını genişleterek ayrı bir iş parçacığı tanımladım. Bu sınıfta AsyncTask'in onPostExecute ve onCancelled yöntemlerinde bazı Tost ve Diyaloglar gerçekleştiriyorum. tost yapmak gereken tek şey söz konusu uygulamanın bağlam böyle gerektirir:İçeride AsyncTask'ı kullanmanın/kullanmanın en iyi yolu nedir?

Toast.makeText(getApplicationContext(),"Some String",1); 

diyaloglar da onun kurucu bir bağlam gerektirir AlertDialog.Builder kullanılarak oluşturulur. Bu bağlamın Faaliyetin içeriği olması gerektiğini düşünerek haklı mıyım? yani getActivity akım aktivitesine döner kullanıcı tanımlı sınıf olabilir

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 

. Eğer öyleyse bu durumun üstesinden gelmenin en iyi yolu nedir? getActivity gibi bir sınıf oluşturmak veya şu anki etkinliğin içeriğini AsyncTask yapıcısına geçirmek mi istiyorsunuz?

Context kullanımını anlamaya çalışıyorum - bellek sızıntılarının bir sorun olabileceğini fark ettim (bunu henüz anlamadım) ve getApplicationContext() kullanımı mümkün olan en iyi yaklaşımdır.

cevap

12

Basitçe Etkinliğin Bir iç sınıfa olarak AsyncTask oluşturabilir veya AsyncTask ait Oluşturucu için Bağlam geçmektedir.

İç sınıfı: MyActivity.java

public class MyActivity extends Activity { 

    // your other methods of the activity here... 


    private class MyTask extends AsyncTask<Void, Void, Void> { 

     protected Void doInBackground(Void... param) { 

      publishProgress(...); // this will call onProgressUpdate(); 
     } 

     protected Void onProgressUpdate(Void... prog) { 

      Toast.makeText(getActivity(), "text", 1000).show(); 
     } 
    } 
} 

Yapıcı: MyTask.java Dahası

public class MyTask extends AsyncTask<Void, Void, Void> { 

    Context c; 

    public MyTask(Context c) { 
      this.c = c; 
    } 

    protected Void doInBackground(Void... param) { 

      publishProgress(...); // this will call onProgressUpdate(); 
    } 

    protected Void onProgressUpdate(Void... prog) { 
      Toast.makeText(c, "text", 1000).show(); 
    } 
} 

, senin Diyaloğu üzerinde çağrı .Show() unutmayın lütfen .

+0

Teşekkürler Phil. AsyncTask'im şu anda benim aktivitem için içsel bir sınıftır (yukarıdaki gibi). Ancak, bu Totem.makeText (getApplicationContext(), ... 'MyTask'ın UI yöntemleri,' AlertDialog.Builder (getApplicationContext()) 'için çalışıyor iken, bu işe yaramıyor. Doğru bağlamı almak Bu nedenle, aktivitenin içeriğini MyTask'ın yapıcısına iletmek bir gereklilik değil midir? Yoksa bir şey eksik miyim? –

+0

Diyaloğunuzu yaptığınız yerin tam kodunu gönderebilir misiniz? Dialog üzerinde .show() yöntemini çağırın –

+0

Tamam, evet! Hem Toast 'hem de' AlertDialog ', yukarıdaki gibi gösterdiğiniz gibi MyTask'ın yapıcısına içeriği aktarırken, yani MyTask'ı kullanarak MyTask'ı başlatırken (MyTask) Bu etkinlik, ana faaliyette bir onClick olayından, yani, sadece açıklığa kavuşmak zorundayım: 'MyTask (this)', aktiviteyi hem 'Toast' hem de 'AlertDialog' tarafından kullanılabilen' MyTask'a iletir. "Toast", getApplicationContext() 'yi kullanarak uygulamalar bağlamını kullanabilirken," AlertDialog ", yani Etkinliğin içeriği - yanlış gittiğim yer olduğunu düşünün. –

İlgili konular