Hasta el 15/2/2012 todavía no he encontrado una buena explicación ni una razón por la que esto no funciona. Lo más cercano a una solución es usar el enfoque tradicional de Thread , pero entonces, ¿por qué incluir una clase que no (parece) funcionar en el SDK de Android?
¡Incluso así!
Tengo una subclase AsyncTask:
// ParseListener had a callback which was called when an item was parsed in a
// RSS-xml, but as stated further down it is not used at all right now.
private class xmlAsync extends AsyncTask<String, RSSItem, Void> implements ParseListener
Eso se ejecuta así:
xmlAsync xmlThread = new xmlAsync();
xmlThread.execute("http://www.nothing.com");
Ahora bien, esta subclase se ha encontrado con un pequeño error. Anteriormente, hizo un análisis de xml, pero cuando noté que no se llamaba doInBackground () , lo eliminé , línea por línea, y finalmente terminé con esto:
@Override
protected Void doInBackground(String... params)
{
Log.v(TAG, "doInBackground");
return null;
}
Que, por alguna razón, no registró nada. Sin embargo, agregué esto:
@Override
protected void onPreExecute()
{
Log.v(TAG, "onPreExecute");
super.onPreExecute();
}
Y esa línea de hecho se registra al ejecutar el hilo. Entonces, de alguna manera, se llama a onPreExecute () pero no a doInBackground () . Tengo otra AsyncTask ejecutándose en segundo plano al mismo tiempo que funciona bien.
Actualmente estoy ejecutando la aplicación en un emulador, SDK versión 15, Eclipse, Mac OS X 10.7.2, cerca del Polo Norte.
EDITAR:
@Override
protected void onProgressUpdate(RSSItem... values) {
if(values[0] == null)
{
// activity function which merely creates a dialog
showInputError();
}
else
{
Log.v(TAG, "adding "+values[0].toString());
_tableManager.addRSSItem(values[0]);
}
super.onProgressUpdate(values);
}
_tableManager.addRSSItem () más o menos agrega una fila a una SQLiteDatabase, inicializada con el contexto de la actividad. publishProgress () es llamado por la devolución de llamada de Interface ParseListener. Sin embargo, dado que ni siquiera hago nada excepto log.v en doInBackground (), primero encontré esto innecesario incluso para abrirlo.
EDITAR 2:
Muy bien, para que quede perfectamente claro, esta es la otra AsyncTask, ejecutándose en la misma actividad y funcionando perfectamente bien.
private class dbAsync extends AsyncTask<Void, RSSItem, Void>
{
Integer prevCount;
boolean run;
@Override
protected void onPreExecute() {
run = true;
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
run = true;
prevCount = 0;
while(run)
{
ArrayList<RSSItem> items = _tableManager.getAllItems();
if(items != null)
{
if(items.size() > prevCount)
{
Log.v("db Thread", "Found new item(s)!");
prevCount = items.size();
RSSItem[] itemsArray = new RSSItem[items.size()];
publishProgress(items.toArray(itemsArray));
}
}
SystemClock.sleep(5000);
}
return null;
}
@Override
protected void onProgressUpdate(RSSItem... values) {
ArrayList<RSSItem> list = new ArrayList<RSSItem>();
for(int i = 0; i < values.length; i++)
{
list.add(i, values[i]);
}
setItemsAndUpdateList(list);
super.onProgressUpdate(values);
}
@Override
protected void onCancelled() {
run = false;
super.onCancelled();
}
}
EDITAR 3:
Suspiro, lo siento, soy malo haciendo preguntas. Pero aquí está la inicialización de las tareas.
xmlAsync _xmlParseThread;
dbAsync _dbLookup;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
_dbLookup = new dbAsync();
_dbLookup.execute();
_xmlParseThread = new xmlAsync();
_xmlParseThread.execute("http://www.nothing.com", null);
}