2012 년 2 월 15 일 현재 나는 이것이 작동하지 않는 이유에 대한 좋은 설명이나 이유를 아직 찾지 못했습니다. 솔루션에 가장 가까운 방법은 기존의 스레드 접근 방식 을 사용하는 것이지만 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의 콜백에 의해 호출됩니다. 그러나 doInBackground ()에서 log.v 외에는 아무것도하지 않았기 때문에 처음에는 이것이 불필요하다는 것을 알았습니다.
편집 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);
}