2013-02-22 15 views
15

मैं के साथ एंड्रॉइड LocationManager लाइब्रेरी के नियमित अनुरोध SingleUpdate() रीउटिन का उपयोग कर रहा हूं। जिस कार्यक्षमता को मैं कार्यान्वित करने की कोशिश कर रहा हूं वह यह है कि उपयोगकर्ता एक बटन दबा सकता है और ऐप को अपना वर्तमान स्थान मिल जाएगा और अनुमानित पता प्राप्त करने के लिए रिवर्स जियोकोडिंग निष्पादित करेगा।एंड्रॉइड अनुरोध के लिए टाइम-आउट सेट करें SingleUpdate

मेरी समस्या यह है कि डिवाइस की नेटवर्क स्थिति के आधार पर, स्थान तय करने में काफी समय लग सकता है। मैं एक टाइमआउट कैसे कार्यान्वित कर सकता हूं जो मेरे 'अनुरोध SingleUpdate()' को छोड़ने और उपयोगकर्ता को अपना खूनी पता लगाने के लिए बताएगा?

मेरी कोड:

LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
Criteria criteria = new Criteria(); 
criteria.setAccuracy(Criteria.ACCURACY_FINE); 
criteria.setPowerRequirement(Criteria.POWER_HIGH); 

locationManager.requestSingleUpdate(criteria, new LocationListener(){ 

     @Override 
     public void onLocationChanged(Location location) { 
      // reverse geo-code location 

     } 

     @Override 
     public void onProviderDisabled(String provider) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onProviderEnabled(String provider) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onStatusChanged(String provider, int status, 
       Bundle extras) { 
      // TODO Auto-generated method stub 

     } 

    }, null); 

उत्तर

30

LocationManager समय समाप्त तंत्र है प्रतीत नहीं होता है। लेकिन LocationManager में removeUpdates(LocationListener listener) नामक एक विधि है जिसका उपयोग आप निर्दिष्ट LocationListener पर किसी भी कॉलबैक को रद्द करने के लिए कर सकते हैं।

तो, आप निम्नलिखित छद्म कोड की तरह कुछ के साथ अपने स्वयं टाइमआउट को लागू कर सकते हैं:

final LocationManager locationManager 
     = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 

    // ... 

    final LocationListener myListener = new LocationListener() { 
     //... your LocationListener's methods, as above 
    } 

    Looper myLooper = Looper.myLooper(); 
    locationManager.requestSingleUpdate(criteria, myListener, myLooper); 
    final Handler myHandler = new Handler(myLooper); 
    myHandler.postDelayed(new Runnable() { 
     public void run() { 
      locationManager.removeUpdates(myListener); 
     } 
    }, MY_TIMEOUT_IN_MS); 

मैं कुछ नहीं कर रहा हूँ कि क्या होता है अगर आप के बाद locationManager.removeUpdates(myListener)फोन आप स्थान मिलता है। removeUpdates पर कॉल करने से पहले आप इसके लिए जांच कर सकते हैं। इसके अतिरिक्त

myHandler.removeCallbacks(myRunnable); // where myRunnable == the above Runnable 
+3

, आप किसी कारण से myRunnable संदर्भ नहीं दे सकता है, तो आप myHandler उपयोग कर सकते हैं: या, आप अपने कॉलबैक में onLocationChanged विधि के लिए कुछ इस तरह जोड़ सकता है (और संभवतः अन्य तरीकों के रूप में अच्छी तरह)। removeCallbacksAndMessages (शून्य); बजाय –