2016-05-30 18 views
8

Come passare il contesto nella classe Async Task che è codificata in un file java diverso da Main Activity ma ha chiamato dall'attività principale?Come passare il contesto a AsyncTask?

Qui di seguito è il mio codice:

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

risposta

1

si può semplicemente passare il contesto nel costruttore della vostra AsyncTask.

MyAsyncTask.java

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

    private final Context mContext; 

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

e poi basta utilizzare la variabile mContext nel metodo OnPostExecute().

Quando si chiama AsyncTask da MainActivity, si passa il contesto al costruttore di MyAsyncTask.

MainActivity.java

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

grazie ... sta funzionando –

+3

Il 'AsyncTask' non deve mantenere un forte riferimento al contesto di attività. Ci sono molte domande e risposte su questo. [Eccone uno] (http://stackoverflow.com/questions/19531168/android-context-weak-reference). –

+0

@KevinKrumwiede L'ho modificato, grazie – Tristan

23

si può semplicemente passare un'istanza Context come parametro del costruttore (e conserva una WeakReference ad esso per evitare perdite di memoria).

Ad esempio:

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

E l'esecuzione:

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

Ottima risposta. deve essere accettato –

Problemi correlati