दिलचस्प पोस्ट
आईओएस पर हवाई जहाज मोड का पता लगाएं PHP के लिए सर्वश्रेष्ठ XML पार्सर PHP में die () और exit () में अंतर क्या हैं? कस्टम ऑब्जेक्ट्स के वेक्टर को छांटें एक वस्तु को आरक्षित में निरंतर निरंतर समय में जोड़ें, हे (1)? JSON नोड या एक्सप्रेस का उपयोग करने के लिए उचित तरीका है टच स्क्रीन पर ज़ूमिंग करते समय एक निश्चित तत्व का आकार बदलता है App.config में सेवा इंजेक्ट करें विंडोज कुंजी पर गिट बैश का उपयोग करते समय निजी कुंजी को डिक्रिप्ट करने के लिए पासवर्ड हर बार दर्ज किया जाना चाहिए? जी-प्लोट में एक्स-एक्स पर प्वाइंट क्लीयर एक एस्प बटन पर पोस्टबैक अक्षम कैसे करें मैं एक इटरेटर कैसे लिखूं जो खुद के संदर्भ देता है? आईट्यून्स यूआरएल की समीक्षा करें और आईओएस 7 (यूजर को हमारे एप रेट करने के लिए कहें) ऐपस्टोर एक खाली पेज दिखाएं एंड्रॉइड स्टूडियो प्रतीक को हल नहीं कर सकता लेकिन कोड निष्पादन सही तरीके से किया जा सकता है PHP कॉन्फ़िगरेशन: सिस्टम की टाइमज़ोन सेटिंग्स पर भरोसा करना सुरक्षित नहीं है

विभिन्न पृष्ठभूमि एंड्रॉइड कार्यों के लिए एक इंटरफ़ेस का उपयोग कैसे किया जा सकता है?

ठीक है, मेरे पास दो पृष्ठभूमि कार्य (एसिंक-टास्क) वाला एक गतिविधि वर्ग है, जिसे दो अलग-अलग कक्षाओं में परिभाषित किया गया है

public class GettingBeaconsList extends AsyncTask<String, String, String> public class GettingAirports extends AsyncTask<String, String, String> 

जो मेन क्लास में आरंभ और क्रियान्वित किए जाते हैं

 public class MainClass extends Activity implements DelegateTaskCompleted { int ServiceBoolean = 0; public OnClickListener LoadingBeaconList = new OnClickListener() { public void onClick(View v) { ServiceBoolean =1; new GettingBeaconsList (context,MainClass.this).execute(); } } public OnClickListener LoadingAirportList= new OnClickListener() { public void onClick(View v) { ServiceBoolean =2; new GettingAirports(context,MainClass.this).execute(); } } @Override public void JsonArrayLoaded(JSONArray result) { // bla bla or whatever here i write, does not matter if(ServiceBoolean == 1) { // Load activity 5 } else if( ServiceBoolean == 2) { // Load activity 6 } else if( ServiceBoolean==3 ) { // display Toast or Alert Box or load Activity number 8 } } } 

अब उपरोक्त कोड में मेन क्लास। यह इस तरह से AsynTask सब क्लासेस में इंटरफ़ेस संदर्भ के रूप में संग्रहीत है

 private Context context = null; private DelegateTaskCompleted delegate = null; public GettingBeaconsList (Context context,DelegateTaskCompleted delegate) { this.context = context; this.delegate = delegate; } // And constructor of second AsynTask is same as of First AsynTask Class private Context context = null; private DelegateTaskCompleted delegate = null; public GettingAirports (Context context,DelegateTaskCompleted delegate) { this.context = context; this.delegate = delegate; } 

प्रत्येक एशिनटास्क कक्षा या उपवर्ग के पोस्टएक्सएक्यूट, JSONArray को वापस या कॉलिंग क्लास में वापस भेज दिया जाता है, नीचे दिखाया गया है। इस स्थिति में कॉलिंग क्लास मेनक्लास है लेकिन अन्य गतिविधि वर्ग हैं जो समान ऐसिनटस्क क्लासेस का उपयोग करते हैं (हो रही बीकॉन लिस्ट और गेटएयरपोर्ट )

 protected void onPostExecute(String file_url) { pDialog.dismiss(); delegate.JsonArrayLoaded(gotNearestbeacons); } 

दो अलग-अलग पृष्ठभूमि कार्य या सेवाओं से दो प्रतिक्रियाओं से निपटने के लिए अब मेरे पास मेन क्लास में एक विधि (जेसनअरेरे लोडेड) है। मैं यह पता लगाने के लिए कसौटी का उपयोग कर रहा हूं कि कौन सी सेवा / कक्षा या एशिनटस्क निष्पादित की जाती है।

लेकिन मैं ऐसे परिदृश्य से निपटने का सबसे अच्छा तरीका पूछ रहा हूं जैसे कि हमारे पास भविष्य में 5 या अधिक पृष्ठभूमि सेवाएं हैं और वे जेसनॉन अर्रे भी वापस कर देते हैं, इसलिए मुझे प्रत्येक सेवाओं के लिए अलग-अलग इंटरफेस बनाने की आवश्यकता है?

क्या इस मामले के लिए वस्तु उन्मुख तरीका होना चाहिए?

वेब के समाधान से एकत्रित समाधान "विभिन्न पृष्ठभूमि एंड्रॉइड कार्यों के लिए एक इंटरफ़ेस का उपयोग कैसे किया जा सकता है?"

मैं सोच सकता हूँ कि सबसे सरल समाधान आपके DelegateTaskCompleted इंटरफ़ेस को संशोधित करना है, ताकि यह इस तरह दिखता है:

 public interface DelegateTaskCompleted{ public void JsonArrayLoaded(AsyncTask<String, String, String> task, JSONArray result); } 

फिर अपने onPostExecute नीचे खुद की तरह वापस भेज देंगे:

 protected void onPostExecute(String file_url) { pDialog.dismiss(); delegate.JsonArrayLoaded(this, gotNearestbeacons); } 

अंत में, आपके AsyncTask , आप AsyncTask के प्रकार के आधार पर एक सशर्त जांच कर सकते हैं:

  @Override public void JsonArrayLoaded(AsyncTask<String, String, String> task, JSONArray result) { if(task instanceof GettingBeaconsList) { // do stuff related to the beacon list } else if(task instanceof GettingAirports) { // do airport list stuff } } 

इस तरह से आप आसानी से AsyncTask पहचान कर सकते हैं जो बिना किसी ट्रैक को ट्रैक किए बिना प्रतिक्रिया भेजता है, अगर कोई अन्य इत्यादि से अधिक समय लेता है।


वैकल्पिक रूप से, एक और वर्ग है जो AsyncTask विस्तार AsyncTask लेकिन पहचान के लिए एक अमूर्त चर जोड़ता है।

 public class TrackableAsyncTask extends AsyncTask<String, String, String>{ public abstract int getId(); public static final int ID_AIRPORT = 1; public static final int ID_BEACONS = 2; ... etc } 

इसके बाद आपका हवाई अड्डा और बीकन AsycTasks इसके बजाय AsycTasks विस्तार करते हैं। यह उन्हें getId पद्धति को लागू करने की आवश्यकता होगी।

 public class GettingAirports extends AsyncTask<String, String, String> { public int getId(){ return ID_AIRPORT; } } 

और फिर एक सशर्त करने की बजाय if (task instanceof GettingAirports) आप नीचे की तरह एक switch स्टेटमेंट कर सकते हैं:

 switch(task.getId()){ case TrackableAsyncTask.ID_AIRPORT: // run airport code } 

उम्मीद है की यह मदद करेगा।

हाय, यह कोड आपकी मदद करेगा

यह कॉलबैक का इंटरफ़ेस है

 public interface CallbackReceiver { public void receiveData(Object result); } 

ऐशिनकास्क कक्षा को सार कक्षा के रूप में प्रयोग करें

 public abstract class JsonDataCallback extends AsyncTask<String, String, String> implements CallbackReceiver { private ProgressDialog mProgressDialog; Handler handler; Runnable callback; Activity activity; public JsonDataCallback(Activity activity) { this.activity=activity; mProgressDialog = new ProgressDialog(activity); mProgressDialog.setMessage("Loading Please Wait."); mProgressDialog.setIndeterminate(false); mProgressDialog.setMax(100); mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); mProgressDialog.setCancelable(true); } public abstract void receiveData(Object object); @Override protected void onPreExecute() { mProgressDialog =ProgressDialog.show(activity, "", "Please Wait",true,false); super.onPreExecute(); } @Override protected String doInBackground(String... aurl) { String results=""; // do stuff return results; } @Override protected void onPostExecute(String jsonData) { if (mProgressDialog != null || mProgressDialog.isShowing()){ mProgressDialog.dismiss(); } if(jsonData!=null) { receiveData(jsonData); } } } 

और आपके कोड में इसे इस तरह से उपयोग करें

 String url = ipaddress + "/GrantAdvanceList; JsonDataCallback callbackservice = new JsonDataCallback(yourActivity.this) { @Override public void receiveData(Object object) { jsonRecordsData = (String)object; //do stuff with call back data } }; callbackservice.execute(url, null, null); 

आप कोड को इस तरह से पुन: उपयोग कर सकते हैं, मुझे आशा है कि यह आपकी सहायता करेगा। अग्रिम में धन्यवाद।

आप इसे प्राप्त करने के लिए हेन्डलर पर भी विचार कर सकते हैं। गतिविधि में हेन्डलर बनाएं, इस हैंडलर ऑब्जेक्ट को प्रत्येक एसिंकटस्क पर पास करें। ऑन-पोस्ट कॉल हैंडलर। एंटरमेस्क्रिप्ट मेसेज (CONSTANT_INT); हैंडलर संभाल में मेसेज चेक msg.जो कि या स्विच में होता है इस तरह से हेन्डलर का केवल एक ऑब्जेक्ट बनाया जाएगा और एसीसीक के लिए एक गतिविधि से कई कॉल में इस्तेमाल किया जाएगा

अगर मैं आपकी समस्या को ठीक से समझता हूं, तो आपने कई बार असिनक टास्क को बढ़ा दिया है इन उप-कक्षाओं में से प्रत्येक का लक्ष्य एक ऐसे जेसनअरेरे को एक गतिविधि के पास देना है जो डेलेगेटटैस्क पूर्ण करता है, जहां आप इसके लिए कुछ करेंगे। चुनौती यह है कि "कुछ" जो आप इस JSONArray पर करना चाहते हैं, इसके आधार पर अलग-अलग है, जिस पर असिनका टास्क उत्पन्न हुआ था।

इन मान्यताओं को बंद करने से, कई अलग-अलग तरीके हैं जिससे आप अंतर कर सकते हैं कि एएसिनक टास्क जेसनअरेरे से आया था:

  1. प्रत्येक प्रकार के JSONArray के लिए अपने DelegateTaskCompleted क्लास फ़ाइल में एक स्थिर वैरिएबल, जैसे कि एक int बनाएँ, इसे संभाल करने की आवश्यकता है। इस वैरिएबल के एक ही प्रकार के JsonArrayLoaded के लिए पैरामीटर जोड़ें। उसके बाद, अपने if-else स्टेटमेंट्स या स्विच स्टेटमेंट का उपयोग करें जो सेट के विरूद्ध इस चर को चेक करते हैं और अपने JSONArray के कार्यों को उस पर आधारित करते हैं।
  2. यदि आपके पास JSONArray जेनरेट करने के लिए उपयोग किया गया है, तो 0 के सरणी के सूचक को जानकारी के रूप में जानकारी दें जिसमें इसे पार्स करना है। (शायद अगर आप दूसरे-अगर या स्विच के साथ तुलना कर सकते हैं)
  3. जैसा कि आप सुझाव देते हैं, प्रत्येक AsyncTask के लिए एक अलग इंटरफ़ेस, या वैकल्पिक रूप से एक एकल इंटरफ़ेस एकाधिक विधियों के साथ।

केवल विकल्प 3 एक ऑब्जेक्ट ओरिएंटेड समाधान है, और जैसा कि टिप्पणियों में बताया गया है, स्केलेबिलिटी के कारण एक महान नहीं। यह कोई पूर्ण सूची नहीं है, मेरे विचारों में से कुछ

मैं हालांकि सोच रहा हूँ, अगर यह बिल्कुल भी इंटरफेस का उपयोग करने के लिए इसके लायक है, या कम से कम प्रस्तुत तरीके में। चूंकि JSONArrays जनरेट करने के लिए आपके पास पहले से ही असिनक टास्क के अलग-अलग उप-कक्षाएं हैं, इसलिए मुख्य धागे से doInBackground() इन- doInBackground() पद्धति के भीतर जो कुछ भी आप कर रहे हैं, उस पर ऐसा क्यों नहीं करें, या कम से कम उस कक्षा में उस तर्क को कहीं भी रखें, और सिर्फ परिणाम लौटाते हैं (या संभवत: उन्हें एक डाटाबेस में सामान लेते हैं और उन्हें जब जरूरत होती है)। मैं सोच रहा हूं कि आपके एसिंककास विरासत को संभाल करने का एक बेहतर तरीका हो सकता है जो सभी एक साथ इंटरफेस से बचा जाता है, या कम से कम उन्हें अलग तरह से उपयोग करता है, जैसे कि आपके सभी एसिंकटस्क द्वारा लागू किए गए एक इंटरफ़ेस।

यह वास्तव में मददगार होगा यदि आप अपने प्रश्न को स्पष्ट कर सकते हैं और आपरेशन के प्रकार को समझा सकते हैं कि दोनों AsyncTasks और आपकी JSONArrayLoaded विधि निष्पादित कर रहे हैं, और संभवत: इंटरफेस का इस्तेमाल करने के लिए आपके तर्क के अनुसार। आपके कोड वास्तव में क्या कर रहे हैं और प्राप्त करने की उम्मीद करते हैं, इतनी छोटी जानकारी के साथ ओ ओ के सर्वोत्तम अभ्यासों पर कंक्रीट ओओ का उत्तर या सलाह देना कठिन है।

AsyncTask क्लाइंट दोनों के लिए एक सदस्य चर जोड़ें,

 public class GettingBeaconsList extends AsyncTask<String, String, String> public class GettingAirports extends AsyncTask<String, String, String> 

जैसा

 private int flag; 

और इसके लिए सेटर लिखिए

 public void setFlag(int flag) { this.flag = flag; } 

मेन क्लास में:

 GettingBeaconsList beaconsList = new GettingBeaconsList(context,MainClass.this); beaconsList.setFlag(100); //Declare this flag in integer constant. beaconsList.execute(); GettingAirports airports = new GettingAirports(context, MainClass.this); airports.setFlag(200); airports.execute(); 

दोनों AsyncTask कक्षाओं में प्रतिनिधि की विधि के साथ झंडे पास करते हैं: –

 protected void onPostExecute(String file_url) { pDialog.dismiss(); delegate.JsonArrayLoaded(gotNearestbeacons, flag); //Change the signature of this method } 

प्रतिक्रिया को संभालने के लिए मुख्य क्लास में फिर से: –

 @Override public void JsonArrayLoaded(JSONArray result, int flag) { // Here check which Background task has been completed if(flag == 100) // GettingBeaconsList is executed if(flag == 200) // GettingAirport is executed. // bla bla or whatever here i write, does not matter if(ServiceBoolean == 1) { // Load activity 5 } else if( ServiceBoolean == 2) { // Load activity 6 } else if( ServiceBoolean==3 ) { // display Toast or Alert Box or load Activity number 8 } } 

मेरा सुझाव है कि आप केवल अपनी गतिविधि के लिए एन इनर क्लास का उपयोग करें जो DelegateTaskCompleted लागू करता है। यह सरल, कुशल, स्पष्ट और आसानी से समझने योग्य (रखरखाव) है – और जब आप अपने असिनक टास्क का निर्माण करते हैं, तो आप पहले ही प्रतिनिधि से गुजर रहे हैं, तो क्या यह आपके मन में पहले से ही था?

 public class MainClass extends Activity { // probabnly not static ;) private final class BeaconsDelegate implements DelegateTaskCompleted ... private final class AirportsDelegate implements DelegateTaskCompleted ... }