Tính đến ngày 15/2/2012, tôi vẫn chưa tìm ra lời giải thích hay lý do tại sao điều này không hoạt động. Giải pháp gần nhất là sử dụng cách tiếp cận Chủ đề truyền thống , nhưng sau đó tại sao lại bao gồm một lớp (dường như) không hoạt động trong Android SDK?
Evenin 'VẬY!
Tôi có một lớp con 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
Điều đó được thực hiện như thế này:
xmlAsync xmlThread = new xmlAsync();
xmlThread.execute("http://www.nothing.com");
Bây giờ lớp con này đã gặp một lỗi nhỏ. Trước đây, nó đã thực hiện một số phân tích cú pháp xml, nhưng khi tôi nhận thấy rằng nó không được gọi là doInBackground (), tôi đã loại bỏ nó, từng dòng một, cuối cùng chỉ kết thúc bằng điều này:
@Override
protected Void doInBackground(String... params)
{
Log.v(TAG, "doInBackground");
return null;
}
Mà, vì một số lý do, không ghi nhật ký gì. Tuy nhiên, tôi đã thêm điều này:
@Override
protected void onPreExecute()
{
Log.v(TAG, "onPreExecute");
super.onPreExecute();
}
Và dòng đó thực sự được ghi khi thực thi luồng. Vì vậy, bằng cách nào đó onPreExecute () được gọi nhưng không phải doInBackground () . Tôi có một AsyncTask khác đang chạy trong nền đồng thời hoạt động tốt.
Tôi hiện đang chạy ứng dụng trên trình giả lập, Phiên bản SDK 15, Eclipse, Mac OS X 10.7.2, gần với Bắc Cực.
BIÊN TẬP:
@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 () ít nhiều thêm một hàng vào SQLiteDatabase, được khởi tạo với ngữ cảnh của hoạt động. printProgress () được gọi bởi lệnh gọi lại của Interface ParseListener. Tuy nhiên, vì tôi thậm chí không làm bất cứ điều gì ngoại trừ log.v trong doInBackground (), lần đầu tiên tôi thấy điều này thậm chí không cần thiết.
CHỈNH SỬA 2:
Được rồi, nói một cách hoàn toàn rõ ràng, đây là AsyncTask khác, đang thực thi trong cùng một hoạt động và hoạt động hoàn toàn tốt.
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();
}
}
CHỈNH SỬA 3:
Haizz, xin lỗi, tôi không biết đặt câu hỏi. Nhưng đây là phần khởi tạo của Nhiệm vụ.
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);
}