2016-05-30 22 views
8

Main Activity'dan farklı java dosyasında kodlanan Async Task sınıfında bağlam nasıl iletilir, ancak ana etkinlikten çağrılır?İçerik AsyncTask'a nasıl geçilir?

@Override 

protected void onPostExecute(List<Movie_ModelClass> result) { 
     super.onPostExecute(result); 

     if (result != null) { 
      Movie_Adapter movieAdapter = new Movie_Adapter(new MainActivity().getApplicationContext() , R.layout.custom_row, result); 
      MainActivity ovj_main = new MainActivity(); 
      ovj_main.lv_main.setAdapter(movieAdapter); 
     } else { 
      Toast.makeText(new MainActivity().getApplicationContext() ,"No Data Found", Toast.LENGTH_LONG); 

     } 
     if (progressDialog.isShowing()) { 
      progressDialog.dismiss(); 
    } 

cevap

1

Sadece kendi AsyncTask yapıcısı bağlamı geçirebilirsiniz:

Aşağıda benim kodudur.

MyAsyncTask.java

public class MyAsyncTask extends AsyncTask<Void, Integer, List> { 

    private final Context mContext; 

    public MyAsyncTask(final Context context) { 
     mContext = context; 
    } 
} 

ve sonra sadece OnPostExecute() yönteminde mContext değişken kullanın.

AsyncTask'ınızı MainActivity sayfanızdan aradığınızda, bağlamı MyAsyncTask yapıcısına iletirsiniz.

MainActivity.java

final MyAsyncTask task = new MyAsyncTask(getApplicationContext()); 
task.execute(); 
+0

sayesinde ... o 'AsyncTask' etkinlik bağlamında güçlü bir başvuruyu korumasına olmamalıdır –

+3

çalışıyor. Bununla ilgili birçok Soru-Cevap var. [İşte bir tane] (http://stackoverflow.com/questions/19531168/android-context-weak-reference). –

+0

@KevinKrumwiede Düzenledim, teşekkürler – Tristan

23

sadece yapıcı parametre olarak bir Context örneğini geçer (ve bellek sızıntılarını önlemek için ona bir WeakReference tutmak) olabilir. Örneğin

:

public class ExampleAsyncTask extends AsyncTask { 
    private WeakReference<Context> contextRef; 

    public ExampleAsyncTask(Context context) { 
     contextRef = new WeakReference<>(context); 
    } 

    @Override 
    protected Object doInBackground(Object[] params) { 
     // ... 
    } 

    @Override 
    protected void onPostExecute(Object result) { 
     Context context = contextRef.get(); 
     if (context != null) { 
      // do whatever you'd like with context 
     } 
    } 
} 

Ve yürütme:

new ExampleAsyncTask(aContextInstance).execute(); 
+4

Great Answer. kabul edilmeli. –

İlgili konular