studio hilos funciona curso create como asynctask java android android-asynctask android-context

java - hilos - AsyncTask y Contextos



execute asynctask android (5)

@Eugene van der Merwe

El siguiente código me funciona:) ->

public class ApplicationLauncher extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.applicationlauncher); LoadApplication loadApplication = new LoadApplication(this); loadApplication.execute(null); } private class LoadApplication extends AsyncTask { Context context; ProgressDialog waitSpinner; ConfigurationContainer configuration = ConfigurationContainer.getInstance(); public LoadApplication(Context context) { this.context = context; waitSpinner = new ProgressDialog(this.context); } @Override protected Object doInBackground(Object... args) { publishProgress(null); //Parsing some stuff - not relevant configuration.initialize(context); return null; } @Override protected void onProgressUpdate(Object... values) { super.onProgressUpdate(values); // Only purpose of this method is to show our wait spinner, we dont // (and can''t) show detailed progress updates waitSpinner = ProgressDialog.show(context, "Please Wait ...", "Initializing the application ...", true); } @Override protected void onPostExecute(Object result) { super.onPostExecute(result); waitSpinner.cancel(); } } }

Aclamaciones,

Ready4Android

Así que estoy trabajando en mi primera aplicación multihilo usando Android con la clase AsyncTask. Estoy tratando de usarlo para disparar un Geocoder en un segundo hilo, luego actualizar la interfaz de usuario con onPostExecute, pero me encuentro con un problema con el contexto adecuado.

De alguna manera, me di cuenta de cómo usar Contextos en el hilo principal, pero no estoy exactamente seguro de qué es el Contexto o cómo usarlo en hilos de fondo, y no he encontrado ningún buen ejemplo. ¿Alguna ayuda? Aquí hay un extracto de lo que estoy tratando de hacer:

public class GeoCode extends AsyncTask<GeoThread, Void, GeoThread> { @Override protected GeoThread doInBackground(GeoThread... i) { List<Address> addresses = null; Geocoder geoCode = null; geoCode = new Geocoder(null); //Expects at minimum Geocoder(Context context); addresses = geoCode.getFromLocation(GoldenHour.lat, GoldenHour.lng, 1); } }

Sigue fallando en la sexta línea allí, debido al contexto incorrecto.


El contexto es un objeto que proporciona acceso al entorno de ejecución de la aplicación. En la mayoría de los casos, cuando necesita obtener objetos del entorno Android, como recursos, vistas, clases de infraestructura, etc., debe tener Context en sus manos.

Obtener una instancia de contexto es muy simple cuando está en la clase de actividad. La actividad en sí misma es una subclase del contexto, por lo que todo lo que necesita hacer es usar la palabra clave ''this'' para indicar su contexto actual.

Siempre que cree un código que requiera contexto, debe tener cuidado de pasar el objeto de contexto de su actividad principal. En el caso de su ejemplo, podría agregar un constructor explícito que acepte el contexto como argumento de entrada.


El problema con la actualización de la interfaz de usuario desde una AsyncTask es que necesita el contexto de actividad actual . Pero el contexto se destruye y se recrea para cada cambio de orientación.

Aquí hay una buena respuesta a su pregunta: Comportamiento del contexto de Android AsyncTask


Investigué un poco más, y alguien sugirió pasarlo al hilo (no estoy seguro de por qué no lo pensé). Lo pasé al hilo de Geocoder a través de un argumento, y así, funcionó.


Si no parece que estás usando los parámetros. Podrías usar eso para pasar en el Conetxt.

public class GeoCode extends AsyncTask<Context, Void, GeoThread> { @Override protected GeoThread doInBackground(Context... params) { List<Address> addresses = null; Geocoder geoCode = null; geoCode = new Geocoder(params[0]); //Expects at minimum Geocoder(Context context); addresses = geoCode.getFromLocation(GoldenHour.lat, GoldenHour.lng, 1); } }

Luego desde dentro de tu actividad:

GeoCode myGeoCode = new GeoCode(); myGeoCode.execute(this);