Au 15/2/2012, je n'ai pas encore trouvé de bonne explication ni de raison pour laquelle cela ne fonctionne pas. La solution la plus proche de la réalité est d'utiliser le traditionnel Fil conducteur mais alors pourquoi inclure une classe qui ne fonctionne pas (apparemment) 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
C'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, elle faisait du xml-parsing, mais quand j'ai remarqué que c'était le cas, je me suis dit que c'était le cas. 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;
}
Ce qui, pour une raison quelconque, n'a rien donné. Cependant, j'ai ajouté ceci :
@Override
protected void onPreExecute()
{
Log.v(TAG, "onPreExecute");
super.onPreExecute();
}
Et cette ligne est effectivement enregistrée lors de l'exécution du fil. Ainsi, onPreExecute() est appelé mais pas doInBackground(). . J'ai une autre AsyncTask qui tourne en arrière-plan en même temps et 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.
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() ajoute plus ou moins une ligne à une SQLiteDatabase, initialisée avec le contexte de l'activité. publishProgress() est appelé par le callback de l'Interface ParseListener. Cependant, comme je ne fais rien d'autre que log.v dans doInBackground(), j'ai d'abord trouvé inutile de soulever cette question.
EDIT 2 :
Très bien, pour être parfaitement clair, voici l'autre AsyncTask, qui s'exécute dans la même activité et fonctionne 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();
}
}
EDIT 3 :
Sigh, désolé, je suis mauvais pour poser des questions. Mais voici l'initialisation des Tasks.
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);
}