15/2/2012 পর্যন্ত আমার এখনও ভাল ব্যাখ্যা বা এটি কার্যকর না হওয়ার কারণ খুঁজে পাই। কোনও সমাধানের নিকটতমটি হ'ল traditional তিহ্যবাহী থ্রেড পদ্ধতির ব্যবহার করা , তবে তারপরে অ্যান্ড্রয়েড এসডিকে কাজ করে না এমন একটি বর্গ কেন অন্তর্ভুক্ত করবেন?
ইভেন 'তাই!
আমার একটি অ্যাসিঙ্কটাস্ক সাবক্লাস রয়েছে:
// 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");
এখন এই সাবক্লাসটি একটি সামান্য ত্রুটিতে চলেছে। পূর্বে এটি কিছু এক্সএমএল-পার্সিং করত, কিন্তু যখন আমি লক্ষ্য করেছি যে এটি ডাইনব্যাকগ্রাউন্ড () বলা হয় নি তখন আমি একে একে একে একে নামিয়ে দিয়েছি, অবশেষে ঠিক এইটি দিয়ে শেষ করছি:
@Override
protected Void doInBackground(String... params)
{
Log.v(TAG, "doInBackground");
return null;
}
কোন কারণে কোনও কারণে লগইন হয়নি। তবে আমি এটি যুক্ত করেছি:
@Override
protected void onPreExecute()
{
Log.v(TAG, "onPreExecute");
super.onPreExecute();
}
এবং থ্রেড সম্পাদন করার সময় সেই লাইনটি অবশ্যই লগ হয়। সুতরাং কোনওভাবে অনিয়ন্ত্রিত () বলা হয় তবে doInBackground () নয় । আমার একই সাথে অন্য একটি অ্যাসিঙ্কটাস্ক পটভূমিতে চলছে যা ঠিক কাজ করে।
আমি বর্তমানে উত্তর মেরুর নিকটবর্তী এমুলেটর, এসডিকে সংস্করণ 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 () কমপক্ষে একটি এসকিউএলডিটাবেসে একটি সারি যুক্ত করে, ক্রিয়াকলাপের প্রসঙ্গে শুরু করে। ইন্টারফেস পার্সলিস্টনারের কলব্যাক দ্বারা পাবলিশপ্রোগ্রেস () বলা হয়। যাইহোক, যেহেতু আমি ডইইনব্যাকগ্রাউন্ড () এ লগ.ভ ছাড়াও কিছু করি না আমি প্রথমে এটি আনার জন্যও অপ্রয়োজনীয় দেখতে পেয়েছি।
সম্পাদনা 2:
ঠিক আছে, পুরোপুরি পরিষ্কার করার জন্য, এটি অন্যান্য অ্যাসিঙ্কটাস্ক, একই ক্রিয়াকলাপে চালিত এবং পুরোপুরি সূক্ষ্মভাবে কাজ করে।
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);
}