15/2/2012 तक मुझे अभी तक न तो एक अच्छी व्याख्या मिल पाई है और न ही इस कारण से कि यह काम नहीं करता है। एक समाधान के सबसे करीब पारंपरिक थ्रेड दृष्टिकोण का उपयोग करना है , लेकिन फिर एंड्रॉइड एसडीके में एक वर्ग को क्यों नहीं (प्रतीत होता है) काम करना शामिल है?
शाम 'तो!
मेरे पास एक 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 है जो बस ठीक काम करता है।
मैं वर्तमान में उत्तरी ध्रुव के करीब एक एमुलेटर, एसडीके संस्करण 15, ग्रहण, मैक ओएस एक्स 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 के लिए एक पंक्ति जोड़ता है, जो गतिविधि के संदर्भ के साथ प्रारंभ होता है। पब्लिशप्रोप्रोग्रेस () को इंटरफ़ेस पारसेलिस्टनर के कॉलबैक द्वारा कहा जाता है। हालाँकि, चूंकि मैं 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);
}