Au 15/2/2012, je n'ai pas encore trouvé une bonne explication ni une raison pour laquelle cela ne fonctionne pas. Le plus proche d'une solution est d'utiliser l' approche Thread traditionnelle , mais alors pourquoi inclure une classe qui ne fonctionne pas (semble) dans le SDK Android?
Evenin 'SO!
J'ai une sous-classe 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
Cela est exécuté comme ceci:
xmlAsync xmlThread = new xmlAsync();
xmlThread.execute("http://www.nothing.com");
Maintenant, cette sous-classe a rencontré une petite erreur. Auparavant, il effectuait une analyse XML, mais quand j'ai remarqué que doInBackground () n'était pas appelé, je l'ai dépouillé, ligne par ligne, pour finalement aboutir à ceci:
@Override
protected Void doInBackground(String... params)
{
Log.v(TAG, "doInBackground");
return null;
}
Qui, pour une raison quelconque, n'a rien enregistré. Cependant, j'ai ajouté ceci:
@Override
protected void onPreExecute()
{
Log.v(TAG, "onPreExecute");
super.onPreExecute();
}
Et cette ligne est en effet journalisée lors de l'exécution du thread. Donc en quelque sorte onPreExecute () est appelé mais pas doInBackground () . J'ai une autre AsyncTask en arrière-plan en même temps qui fonctionne très bien.
J'exécute actuellement l'application sur un émulateur, SDK version 15, Eclipse, Mac OS X 10.7.2, près du pôle Nord.
ÉDITER:
@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 () ajoute plus ou moins une ligne à une SQLiteDatabase, initialisée avec le contexte de l'activité. publishProgress () est appelé par le rappel de l'interface ParseListener. Cependant, comme je ne fais même rien d'autre que log.v dans doInBackground (), j'ai d'abord trouvé cela inutile même d'évoquer.
MODIFIER 2:
D'accord, juste pour être parfaitement clair, c'est l'autre AsyncTask, exécutée dans la même activité et fonctionnant parfaitement 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();
}
}
MODIFIER 3:
Soupir, désolé, je suis mauvais pour poser des questions. Mais voici l'initialisation des tâches.
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);
}