2012-08-31 9 views
6

Ci è voluto un po 'di tempo per farlo funzionare, ma chiaramente non è la migliore pratica. In breve, ho bisogno di mostrare una finestra di dialogo quando termina il mio AsyncTask, ma getApplicationContext() non funziona, né lo passa come parametro durante la creazione di AsyncTask. Così ho dichiarato una variabile pubblica per il contesto nella mia classe AsyncTask e metta dinanzi eseguo:Android AsyncTask Miglior modo di accedere al contesto delle attività

private OnClickListener clickLoadRefs = new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Log.d("H","Clicked Load Refs"); 
     RefreshRefPoints refreshRefPoints = new RefreshRefPoints(); 
     refreshRefPoints.myCtx=v.getContext(); 
     refreshRefPoints.execute(v.getContext()); 
    } 
}; 

private class RefreshRefPoints extends AsyncTask<Context, Integer, Integer> { 

    private Integer nPoints=0; 
    public Context myCtx; 
    private ProgressDialog pd; 

    protected Integer doInBackground(Context... ctx) { 
     Log.d("H","doInBackground()"); 
     dbHelper.clearRefPoints(); 
     requestRefPoints(); 
     nPoints = parseRefPointsCSV(); 

     return nPoints; 
    } 

    protected void onProgressUpdate(Integer... progress) { 
    } 

    protected void onPreExecute() 
    { 
     pd = ProgressDialog.show(myCtx, "Refreshing Reference Points", "Loading...", true,false); 
     Log.d("H", "onPreExecute()"); 
    } 
    protected void onPostExecute(Integer result) { 
     pd.dismiss(); 
     AlertDialog.Builder builder = new AlertDialog.Builder(myCtx); 
     builder.setTitle("Reference points refresh complete"); 
     builder.setMessage(result+" records loaded"); 
     builder.setPositiveButton("OK",null); 
     builder.show(); 
     Log.d("H","onPostExecute()");  
    }...etc 

Qualcuno può solo farmi vedere il modo corretto di passare il contesto?

Grazie

risposta

12

Definire un metodo di costruzione e passare un parametro di contesto. Sarebbe meglio.

Ecco quello che volevo dire:

private class RefreshRefPoints extends AsyncTask<Void, Integer, Integer> { 

    private Integer nPoints=0; 
    private Context myCtx; 
    private ProgressDialog pd; 

    public RefreshRefPoints(Context ctx){ 
     // Now set context 
     this.myCtx = ctx; 
    } 

} 

Questo è tutto.

+1

Ma ci sono perdite di memoria –

2

contesto Passo nel costruttore come

private OnClickListener clickLoadRefs = new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Log.d("H","Clicked Load Refs"); 
     RefreshRefPoints refreshRefPoints = new RefreshRefPoints(Your_ActivityName.this); 
     refreshRefPoints.myCtx=v.getContext(); 
     refreshRefPoints.execute(v.getContext()); 
    } 
}; 


private class RefreshRefPoints extends AsyncTask<Void, Integer, Integer> { 

    private Integer nPoints=0; 
    public Context myCtx; 
    private ProgressDialog pd; 

public RefreshRefPoints (Context ctx) { 
    myCtx = ctx; 
} 
+0

Grazie dovrebbe funzionare, ma sto ricevendo lamentele da eclipse re di doInBackground ora che ho cambiato la linea "estende AsyncTask " secondo il vostro campione? –

+1

put ** Void ** in protected Integer doInBackground (** Void ** ...) { –

+0

Nel contesto moderno di fare tutto con i frammenti il ​​valore di questa risposta è degradante. – ed209

10

È inoltre possibile utilizzare YourActivityName.this per fare riferimento all'attività Context. Perché Activites estende Context, quindi è valido farlo.

+0

Grazie - non ti rendi conto! –

+1

Nota che se la tua attività non viene istanziata o uccisa, chiamando il codice in questa risposta genererà NullPointerException. –