2016-05-30 16 views
8

Jak przekazać kontekst w klasie Async Task zakodowanej w innym pliku java z Main Activity, ale wywołanym z głównej aktywności?Jak przekazać kontekst do AsyncTask?

Poniżej jest mój kod:

@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(); 
    } 

Odpowiedz

1

można po prostu przekazać kontekst w konstruktorze swojej AsyncTask.

MyAsyncTask.java

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

    private final Context mContext; 

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

a potem po prostu użyć zmiennej mContext w sposobie swojej onPostExecute().

Kiedy wywołujesz AsyncTask z MainActivity, przekazujesz kontekst do konstruktora MyAsyncTask.

MainActivity.java

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

dzięki ... to działa –

+3

Opcja 'AsyncTask' nie powinny zachować silne odniesienie do kontekstu aktywności. Istnieje wiele pytań i odpowiedzi na ten temat. [Tutaj jest jeden] (http://stackoverflow.com/questions/19531168/android-context-weak-reference). –

+0

@KevinKrumwiede Edytowałem, dzięki – Tristan

23

Możesz po prostu przejść instancję Context jako parametr konstruktora (i prowadź WeakReference do niego, aby uniknąć przecieków pamięci).

Na przykład:

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 
     } 
    } 
} 

I wykonujący:

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

Świetna odpowiedź. to musi zostać zaakceptowane. –

Powiązane problemy