15/2/2012 itibariyle bunun neden işe yaramadığına dair iyi bir açıklama veya neden bulamadım. Çözüme en yakın olanı geleneksel Thread yaklaşımını kullanmaktır , ancak o zaman neden Android SDK'da çalışmayan (görünmeyen) bir sınıfı dahil edelim?
İyi akşamlar!
Bir AsyncTask alt sınıfım var:
// 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
Bu şu şekilde idam edilir:
xmlAsync xmlThread = new xmlAsync();
xmlThread.execute("http://www.nothing.com");
Şimdi bu alt sınıf küçük bir hatayla karşılaştı. Daha önce biraz xml ayrıştırması yapıyordu , ancak doInBackground () olarak adlandırılmadığını fark ettiğimde onu satır satır soydum ve sonunda şununla bitirdim :
@Override
protected Void doInBackground(String... params)
{
Log.v(TAG, "doInBackground");
return null;
}
Bazı nedenlerden dolayı hiçbir şey kaydetmedi. Ancak şunu ekledim:
@Override
protected void onPreExecute()
{
Log.v(TAG, "onPreExecute");
super.onPreExecute();
}
Ve bu satır, iş parçacığı yürütülürken gerçekten günlüğe kaydedilir. Yani bir şekilde onPreExecute () çağrılır ama doInBackground () . Aynı zamanda arka planda çalışan ve gayet iyi çalışan başka bir AsyncTask var.
Şu anda uygulamayı Kuzey Kutbu'na yakın bir emülatörde, SDK Sürüm 15, Eclipse, Mac OS X 10.7.2'de çalıştırıyorum.
DÜZENLE:
@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 () az ya da çok, etkinliğin bağlamıyla başlatılan bir SQLiteDatabase'e bir satır ekler. publishProgress (), Arayüz ParseListener'ın geri araması tarafından çağrılır. Ancak, doInBackground () içinde log.v dışında hiçbir şey yapmadığım için, bunu ilk önce bile gereksiz buldum.
DÜZENLEME 2:
Pekala, tamamen açık olmak gerekirse, bu diğer AsyncTask, aynı aktivitede çalışıyor ve mükemmel çalışıyor.
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();
}
}
DÜZENLEME 3:
Ah, üzgünüm soru sormakta kötüyüm. Ama işte Görevlerin ilklendirilmesi.
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);
}