ณ วันที่ 15/2/2012 ฉันยังไม่พบคำอธิบายที่ดีหรือเหตุผลว่าทำไมจึงใช้ไม่ได้ วิธีแก้ปัญหาที่ใกล้เคียงที่สุดคือการใช้วิธีเธรดแบบเดิมแต่เหตุใดจึงรวมคลาสที่ไม่ (ดูเหมือนจะ) ทำงานใน Android SDK
Evenin 'SO!
ฉันมีคลาสย่อย 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
ที่ดำเนินการดังนี้:
xmlAsync xmlThread = new xmlAsync();
xmlThread.execute("http://www.nothing.com");
ตอนนี้คลาสย่อยนี้มีข้อผิดพลาดเล็กน้อย ก่อนหน้านี้มีการแยกวิเคราะห์ xml แต่เมื่อฉันสังเกตเห็นว่าdoInBackground ()ไม่ได้ถูกเรียกว่าฉันถอดมันลงทีละบรรทัดในที่สุดก็จบลงด้วยสิ่งนี้:
@Override
protected Void doInBackground(String... params)
{
Log.v(TAG, "doInBackground");
return null;
}
ซึ่งด้วยเหตุผลบางอย่างไม่ได้บันทึกอะไรเลย อย่างไรก็ตามฉันได้เพิ่มสิ่งนี้:
@Override
protected void onPreExecute()
{
Log.v(TAG, "onPreExecute");
super.onPreExecute();
}
และบรรทัดนั้นจะถูกบันทึกเมื่อเรียกใช้เธรด ดังนั้นอย่างใด onPreExecute () เรียกว่า แต่ไม่ doInBackground () ฉันมี AsyncTask อื่นที่ทำงานในพื้นหลังในเวลาเดียวกันซึ่งใช้งานได้ดี
ฉันกำลังใช้งานแอปบนโปรแกรมจำลอง SDK เวอร์ชัน 15, Eclipse, Mac OS X 10.7.2 ใกล้กับขั้วโลกเหนือ
แก้ไข:
@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 () มากหรือน้อยจะเพิ่มแถวไปยัง SQLiteDatabase โดยเริ่มต้นด้วยบริบทของกิจกรรม PublishProgress () ถูกเรียกโดยการเรียกกลับของ Interface ParseListener อย่างไรก็ตามเนื่องจากฉันไม่ได้ทำอะไรเลยนอกจาก log.v ใน doInBackground () ฉันจึงพบว่าสิ่งนี้ไม่จำเป็นที่จะต้องเปิดขึ้นมา
แก้ไข 2:
เอาล่ะเพื่อให้ชัดเจนอย่างสมบูรณ์นี่คือ AsyncTask อื่นที่ทำงานในกิจกรรมเดียวกันและทำงานได้ดีอย่างสมบูรณ์
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();
}
}
แก้ไข 3:
เฮ้อขอโทษที่ถามคำถามไม่ดี แต่นี่คือการเริ่มต้นของงาน
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);
}