A partire dal 15/2/2012 non ho ancora trovato una buona spiegazione né un motivo per cui questo non funziona. Il più vicino a una soluzione è utilizzare l' approccio Thread tradizionale , ma allora perché includere una classe che non (sembra) funziona nell'SDK Android?
Anche così!
Ho una sottoclasse 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
Viene eseguito in questo modo:
xmlAsync xmlThread = new xmlAsync();
xmlThread.execute("http://www.nothing.com");
Ora questa sottoclasse ha riscontrato un piccolo errore. In precedenza ha eseguito un po 'di analisi xml, ma quando ho notato che doInBackground () non si chiamava, l'ho smontato, riga per riga, finendo infine con questo:
@Override
protected Void doInBackground(String... params)
{
Log.v(TAG, "doInBackground");
return null;
}
Che, per qualche motivo, non ha registrato nulla. Tuttavia, ho aggiunto questo:
@Override
protected void onPreExecute()
{
Log.v(TAG, "onPreExecute");
super.onPreExecute();
}
E quella riga viene effettivamente registrata durante l'esecuzione del thread. Quindi in qualche modo viene chiamato onPreExecute () ma non doInBackground () . Ho un altro AsyncTask in esecuzione in background allo stesso tempo che funziona perfettamente.
Attualmente sto eseguendo l'app su un emulatore, SDK versione 15, Eclipse, Mac OS X 10.7.2, vicino al Polo Nord.
MODIFICARE:
@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 () aggiunge più o meno una riga a un SQLiteDatabase, inizializzato con il contesto dell'attività. publishProgress () viene chiamato dal callback di Interface ParseListener. Tuttavia, poiché non faccio nemmeno nulla tranne log.v in doInBackground (), per prima cosa ho trovato questo non necessario nemmeno per farlo apparire.
MODIFICA 2:
Va bene, solo per essere perfettamente chiari, questo è l'altro AsyncTask, che viene eseguito nella stessa attività e funziona perfettamente.
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();
}
}
MODIFICA 3:
Sigh, scusa, non sono bravo a fare domande. Ma ecco l'inizializzazione delle attività.
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);
}