Per 15/2/2012 saya belum menemukan penjelasan yang baik atau alasan mengapa ini tidak berhasil. Solusi terdekat adalah dengan menggunakan pendekatan Thread tradisional , tetapi mengapa menyertakan kelas yang tidak (tampaknya) berfungsi di Android SDK?
Evenin 'SO!
Saya memiliki subkelas 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
Itu dijalankan seperti ini:
xmlAsync xmlThread = new xmlAsync();
xmlThread.execute("http://www.nothing.com");
Sekarang subclass ini mengalami sedikit kesalahan. Sebelumnya itu melakukan beberapa xml-parsing, tetapi ketika saya perhatikan bahwa doInBackground () tidak dipanggil, saya melepasnya , baris demi baris, akhirnya berakhir hanya dengan ini:
@Override
protected Void doInBackground(String... params)
{
Log.v(TAG, "doInBackground");
return null;
}
Yang, untuk beberapa alasan, tidak mencatat apa pun. Namun, saya menambahkan ini:
@Override
protected void onPreExecute()
{
Log.v(TAG, "onPreExecute");
super.onPreExecute();
}
Dan baris itu memang dicatat saat menjalankan utas. Jadi entah bagaimana onPreExecute () dipanggil tetapi tidak doInBackground () . Saya memiliki AsyncTask lain yang berjalan di latar belakang pada saat yang sama yang berfungsi dengan baik.
Saat ini saya menjalankan aplikasi di emulator, SDK Versi 15, Eclipse, Mac OS X 10.7.2, dekat Kutub Utara.
EDIT:
@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 () sedikit banyak menambahkan baris ke SQLiteDatabase, diinisialisasi dengan konteks aktivitas. publishProgress () dipanggil oleh callback Interface ParseListener. Namun, karena saya bahkan tidak melakukan apa pun kecuali log.v di doInBackground () saya pertama kali menemukan ini bahkan tidak perlu untuk dimunculkan.
EDIT 2:
Baiklah, untuk memperjelas, ini adalah AsyncTask lainnya, yang dijalankan dalam aktivitas yang sama dan berfungsi dengan baik.
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, maaf saya buruk dalam mengajukan pertanyaan. Tapi di sini adalah inisialisasi Tugas.
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);
}