2012-06-21 6 views
7

जब यह कॉलबैक मेरे एप्लिकेशन में किया जाता है, मैं (पढ़ने में एक ORM lib के माध्यम से एसक्यूएल डाटाबेस को & लेखन और दूरी आधारित गणना की एक संख्या) करने के लिए काफ़ी काम किया है। स्वाभाविक रूप से मैं मुख्य यूआई धागा नहीं अवरुद्ध तो मैं पता लगाने के लिए अगर यह धागा है जिस पर कॉलबैक किया जाता है (असफल) की कोशिश कर रहा किया गया है के बारे में चिंतित हूँ। यदि ऐसा है, तो मैं कॉलबैक किए जाने पर एक AsyncTask ट्रिगर किए गए सभी उपरोक्त कार्यों को करने का इरादा रख रहा हूं। यह वही AsyncTask भी 2 अलग गतिविधि कक्षाओं से घटनाओं को प्राप्त करेगा। (उपयोगकर्ता इनपुट आदि का जवाब देते हुए ..)ऑनलाक्शन चेंजड कॉलबैक क्या थ्रेड पर बनाया गया है? मुख्य यूआई धागा?

चर्चा मैं इस कॉलबैक के आसपास पाया है का एक बहुत धागा है जिस पर कॉलबैक वास्तव में प्राप्त है, उसे बदलने की कोशिश कर लोगों के आसपास आधारित जा रहा है। त्रि - आयामी यह बेमतलब का लगता है। निश्चित रूप से मंच इस कॉलबैक के संदर्भ और जब उसे प्राप्त हुए एक और धागा, AsyncTask उपयुक्त लग रहा है, जिसके लिए पर किसी भी गंभीर काम ऑफलोड है ऐसा करने के लिए समझदार बात निर्धारित करता है।

किसी को भी एक सफल पैटर्न वे यहाँ का उपयोग किया है की रूपरेखा तैयार कर सकते हैं यह वास्तव में उपयोगी होगा।

उत्तर

7

LocationManager के लिए एंड्रॉयड संदर्भ दस्तावेज़ के अनुसार:

बुला धागा ऐसे बुला गतिविधि का मुख्य थ्रेड के रूप में एक Looper धागा होना चाहिए।

इसका मतलब है कि कॉलबैक शुरू करने वाला थ्रेड मुख्य थ्रेड या Looper थ्रेड होना चाहिए।

मुझे यह पता लगाने का सबसे अच्छा तरीका मिला है कि यह मुख्य थ्रेड पर OnLocationChanged रिसीवर पंजीकृत करना है। फिर, मेरे कॉलबैक में मैं पृष्ठभूमि थ्रेड को भेजने के लिए एक रननेबल बनाउंगा जहां मैं किसी भी लंबे समय से चलने वाले कार्यों (जैसे डेटाबेस में लिखना) करूँगा।

ExecutorService mThreadPool = Executors.newSingleThreadExecutor(); 

@Override 
public void onLocationChanged(Location location) { 
    mThreadPool.execute(new Runnable() { 
     @Override 
     public void run() { 
      // Perform your long-running tasks here. 
      //... 
     } 
    }); 
} 
+0

प्रलेखन से यह प्रतीत होता है कि धागा है जिस पर onLocationChanged पीठ पर कहा जाता है, इनमें से जो भी मापदंडों के requestLocationUpdate (..) कॉल प्रयोग किया जाता है पारित कर दिया पर निर्भर करता है। इसके अलावा यदि एक लूपर पैराम में से एक नहीं है तो कॉलबैक मुख्य यूआई थ्रेड के संदर्भ में किया जाएगा। लूपर्स के बारे में कुछ और पढ़ने की जरूरत है। उपरोक्त समाधान समझदार दिखता है। अब मैं सोच रहा हूं कि यह प्रदर्शन के संदर्भ में AsyncTask का उपयोग करने के साथ तुलना करता है। इसलिए मैं दस्तावेज को पढ़ूंगा और पढ़ूंगा क्योंकि मुझे पहले स्थान पर होना चाहिए था। सहायता के लिए धन्यवाद। –

+0

आप सही हैं, वहाँ एक 'LocationListener' कॉलबैक पंजीकरण के लिए कई विकल्प हैं। दस्तावेज पढ़ना निश्चित रूप से अनुशंसित है। उपरोक्त समाधान लगभग 'AsyncTask' का उपयोग करने के बराबर है। मेरा मानना ​​है कि यदि आप 'AsyncTask' कक्षा के स्रोत को देखते हैं तो आप देखेंगे कि यह आंतरिक रूप से 'निष्पादक सेवा' का उपयोग करता है। हालांकि, यदि आपके कार्य को पूरा होने पर आपको यूआई थ्रेड के साथ बातचीत करने की आवश्यकता नहीं है, तो आपको 'AsyncTask' की आवश्यकता से अधिक की आवश्यकता होगी। – twaddington

संबंधित मुद्दे