2012-08-31 18 views
6

Me llevó un buen rato hacer que esto funcione, pero claramente no es una buena práctica. En resumen, necesito mostrar un cuadro de diálogo cuando finaliza mi AsyncTask, pero getApplicationContext() no funciona, ni lo pasa como parámetro al crear AsyncTask. Así que he declarado una variable pública para el contexto en mi clase AsyncTask y la ponga delante ejecuto:Android AsyncTask Mejor forma de acceder a la actividad Contexto

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 

Puede alguien me acaba de mostrar la forma correcta de pasar el contexto?

Gracias

Respuesta

12

definir un método constructor y pasar contexto un parámetro. Sería mejor.

Aquí lo que quería decir:

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

} 

eso es todo.

+1

Pero da pérdidas de memoria –

2

contexto Pass en el constructor como

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

Gracias debería funcionar, pero estoy recibiendo quejas de eclipse re por doInBackground ahora que cambié la línea "extiende AsyncTask " según su muestra? –

+1

put ** Void ** en entero protegido doInBackground (** Void ** ...) { –

+0

En el contexto moderno de hacer todo con fragmentos, el valor de esta respuesta es degradante. – ed209

10

También puede usar YourActivityName.this para hacer referencia a la actividad Context. Debido a que Activites extiende Context, entonces es válido hacerlo.

+0

Gracias, ¡no me di cuenta! –

+1

Tenga en cuenta que si su actividad no es instanciada o muerta, llamar al código en esta respuesta dará como resultado una NullPointerException. –

Cuestiones relacionadas