2013-08-14 13 views
8

Başlık, hemen hemen her şeyi söylüyor. Bir sınıftan diğerine bir geri bildirimde bulunmanız ve bir bağlam gerektiren bir geriçağırım yöntemini kullanmanız gereken doğru bağlam nedir? Yaygın bir örnek, kullanılan Activity veya Fragment numaralı bir geri bildirime sahip bir AsyncTask olacaktır.Geri aramalar içinde kullanılacak doğru içerik

Genellikle getApplicationContext() kullanmaktan kaçınmaya çalışıyorum ancak this'u bağlam içinde bir geri arama içinden kullanamıyorum. Daha geniş bir bağlamın kullanılması uygun bir durum mu?

Daha fazla netleştirmek için bir AsyncTask ile bir etkinlik arasında bir arabirim ile geri arama yapmayı düşünüyorum. Geçersiz kılınmış arayüz yönteminin içindeyken, etkinlik içeriğini oradan alamıyorum.

+1

sen ne demek istiyorsunuz :) hiçbir şey etkinlik içinde bir şey için bir bağlam gerekirse – tyczj

+1

Yani ben sadece kullanabilirsiniz "hiçbir şey size this'' almama izin verdi" olabilir Bu bir bağlam olarak. Bir parça için getActivity() kullanırdım. – Rarw

cevap

7

Etkinliğin içeriğini kullanın. Örnek:

MyAsyncTask mat = new MyAsyncTask(this); 

MyAsyncTask contructor:

public MyAsyncTask(MyActivity context) { 
    mContext = context; 
} 

MyAsyncTask içinden MyActivity yöntemini methodToCall() çağırmak için:

((MyActivity)mContext).methodToCall(); 

Düzenleme 1:

Ben tahmin ediyorum senin problemli m, şudur:

public class MyActivity extends Activity { 

    Button b; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.some_layout); 

     b = (Button) findViewById(...); 

     b.setOnClickListener(new OnClickListener() {  
      @Override 
      public void onClick(View v) { 
       Button newButton = new Button(this);  // Won't work!! 
      } 
     }); 
    } 
} 

Çözüm:

  • MyActivity bir yöntem bildirin: this yerine getContext()

    public Context getContext() { 
        return (Context)this; 
    } 
    
    b.setOnClickListener(new OnClickListener() {  
        @Override 
        public void onClick(View v) { 
         Button newButton = new Button(getContext()); // Will work 
        } 
    }); 
    
  • kullanımı MyActivity.this.

  • başka yolu da o MyActivity arabirimini uygulayan devlet şudur:

    public class MyActivity extends Activity implements View.OnClickListener { 
    
        .... 
        .... 
    
        @Override 
        public void onClick(View v) { 
         Button newButton = Button (this)    // Will Work 
        } 
    } 
    
+0

Bir arayüz kullanarak aktiviteyi geri çağırıyorsam - bu yöntemde ne kullanırdım? Arabirim yöntemini geçersiz kıldığımda, ben de etkinlik bağlamını alamıyorum ya da AsyncTask içeriği bunu arayüzden geçmeden yapabilir miyim? – Rarw

+0

@Rarw Yorumunuzu biraz kafa karıştırıcı buluyorum.Yani, A Aktivitesi'nin View.OnClickListener'ı uyguladığını varsayalım. Etkinlik A, daha sonra onClick (Görünüm) yöntemini tanımlar. Etkinliğin A içeriğini (veya yöntemlerini) onClick (Görünüm) 'içinde kullanıp kullanamayacağını mı soruyorsunuz? Bu sizin sorunuz değilse, açıklamak için bir örnek olabilir misiniz? – Vikram

+0

@Rarw Düzenlemenize kadar, ne yaptığınızı biliyorum. Yukarıdaki Edit 1'e bakın. – Vikram

0

Bir konu aber "sızıntı" dır. Öncelikle geçirilecek faaliyet iyi değil. İnsanların getApplication veya getApplicationContext kullanması gereken diğer önerilere göre. Ama yani, senin sarmalayıcı için WeakReference kullanabilirsiniz:

static class X { 
    WeakReference<Activity> context; 
    X(Activity context) { 
     this.context = new WeakReference<Activity>(context); 
    } 
} 

sınıfınızı işaretlemek için statik kullanmak Unutmayın, potansiyel "Bu" barındırıcınıza Aktivite önlemek olabilir.

, size bazı öneriler verdik Olabilir