2010-08-22 10 views
5

मैं एंड्रॉइड के लिए नया हूं, इसे मेरे साथ सहन करें।हैंडलर थ्रेड रन

मेरे पास टाइमरटास्क है जिसके लिए मैं सेवा के अंदर रन() को परिभाषित करता हूं। रन() के अंदर, मैं

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 
    LOCATION_UPDATES_MIN_TIME_MS, LOCATION_UPDATES_MIN_DISTANCE_M, gpsListener); 

और यह शिकायत करता है कि हैंडलर नहीं बना सकता, क्योंकि मुझे इसका पृष्ठभूमि धागा माना जाता है। मैं इसे कैसे हल करूं?

संपादित करें: कोड स्निपेट

locationTask = new TimerTask() { 

     @Override 
     public void run() { 
      Log.d(Commands.TAG, "Running location Task"); 
      myLocationProvider = new MyLocationProvider(locationManager, handler, MyService.this); 
      myLocationProvider.start(); 
      myLocationProvider.stop(); 
     } 
    }; 

और बाद में नीचे के रूप में अनुसूचित:

locationTimer = new Timer(); 
    locationTimer.schedule(locationTask, 10000, cmds.getAlertInterval()*60); 

और जब .start कहा जाता है, requestLocationUpdates() विफल रहता है

+0

इसका आपका समाधान क्या था? मुझे एक ही समस्या है (एक टाइमर के अंदर से जीपीएस तक पहुंच)। – stackoverflowuser2010

उत्तर

4

आप की जरूरत है कॉल अनुरोध स्थान एक लूपर के साथ थ्रेड के भीतर से अद्यतन करता है, यानी अधिमानतः मुख्य धागा। (requestLocation अद्यतन करता है जल्दी है और ब्लॉक नहीं करता है, इसलिए ऐसा करने में कोई शर्म नहीं है)।

यदि आपका ऐप इस तरह से लिखा गया है कि आपको ऐसा करने से रोकता है, तो आप हैंडलर का उपयोग कर सकते हैं। प्रलेखन एक उदाहरण है कि काफी वास्तव में आप क्या जरूरत किया जाना चाहिए है: http://developer.android.com/resources/articles/timed-ui-updates.html

वैकल्पिक रूप से, आप इस अनुदेश के साथ एक Runnable बना सकते हैं और उस पर Activity.runOnUiThread() कॉल कर सकते हैं।

+1

मैं इसे मुख्य थ्रेड से नहीं चला सकता क्योंकि इसे टाइमरटास्क (जो एक धागा है) का हिस्सा बनना है, और जब मैं Looper.prepare() के साथ घिरा हुआ हूं; अनुरोध स्थान अपडेट(); Looper.loop(); यह अंतिम वक्तव्य पर आपके वैकल्पिक समाधान के लिए जमा हो जाएगा, गतिविधि का उपयोग नहीं किया जा सकता क्योंकि यह एक सेवा है और यूआई थ्रेड नहीं है। कोई विकल्प? – Taranfx

+0

आपने हैंडलर को किस धागे में बनाया था? क्या आप कोड का थोड़ा और पोस्ट कर सकते हैं, और त्रुटि संदेश? – EboMike

1

मुझे ऐसा कुछ अनुभव हुआ जहां मुझे स्थान थिस्टर को अपने स्वयं के धागे (लूपर के साथ)/हैंडलर थ्रेड के साथ मिलाकर स्थान अपडेट प्राप्त नहीं हुए। समाधान एक लंबित इंटेन्टेंट और requestLocationUpdates (प्रदाता, minTime, minDistance, मंशा) का उपयोग करना था। एक नज़र डालें: How to receive location updates without using a service

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