संपादित करें: मैं इस प्रश्न को फिर से लिख रहा हूं क्योंकि मैं स्पष्ट रूप से स्पष्ट नहीं था।एंड्रॉइड जीपीएस टाइमआउट
कभी-कभी एंड्रॉइड फोन पर जीपीएस सेवा को ठीक करने में काफी समय लगता है। कभी-कभी यह तेज़ होता है, कभी-कभी इसमें घंटों लगते हैं। मैं जानता हूं और इसे स्वीकार करता हूं।
मेरे पास एक ऐसा एप्लिकेशन है जो कई चीजें करता है। चीजों में से एक यह है कि उपयोगकर्ता को अपने मौजूदा निर्देशांक को सर्वर पर भेजने के लिए बटन पर क्लिक करने की अनुमति दें। मुझे फोन के निर्देशांक हैं, जब उपयोगकर्ता बटन पर क्लिक करता है या उसके बाद एक उचित समय के भीतर।
क्योंकि मुझे पता है कि एक जीपीएस फिक्स प्राप्त करना तत्काल नहीं है और मुझे पता है कि इसमें मिनट या घंटे लग सकते हैं (जिसके दौरान उपयोगकर्ता ने बहुत दूरी तय की है), मुझे इस सुविधा के लिए टाइमआउट कोड करना होगा। इस सुविधा के लिए, बटन पर क्लिक करने के बाद उपयोगकर्ता के जीपीएस स्थान को तीन मिनट (उदाहरण के लिए) अपलोड करना स्वीकार्य नहीं है। यह ठीक है अगर इसमें 45 सेकंड लगते हैं, तो ठीक नहीं है अगर इसमें 75 सेकंड लगते हैं। यदि सुविधा पर्याप्त तेज़ी से स्थान प्राप्त करने में विफल रही तो उपयोगकर्ता को एक त्रुटि अधिसूचना देना ठीक है।
मुझे जीपीएस स्थान प्राप्त करने और इसे सर्वर पर भेजने के लिए एक सुविधा की आवश्यकता है, जब तक कि इसमें एक से अधिक मिनट 'नहीं लगे।
मेरा मूल कोड नीचे है। मैंने इसे पोस्ट करने के बाद कुछ चीजें बदल दी हैं। मैंने ऑनस्टार्ट कमांड() विधि में एक टाइमर जोड़ा है। मैं टाइमरटास्क शुरू करता हूं कि 60 सेकंड के बाद मेरी स्टॉप() विधि को कॉल करेगा। ऑनलाक्शन चेंज() विधि की शुरुआत में, मैं टाइमरटास्क रद्द करता हूं।
मेरा सवाल है: क्या टाइमर योजना इस टाइमआउट को लागू करने का एक अच्छा तरीका है? क्या कोई बेहतर तरीका है?
मूल प्रश्न:
मैं एक Android एप्लिकेशन है, अन्य बातों के अलावा, एक सर्वर के लिए वर्तमान जीपीएस निर्देशांक भेजने के लिए जब उपयोगकर्ता इसे करने के लिए कहता है की जरूरत है लिख रहा हूँ। एक संदर्भ मेनू से, मैं नीचे सेवा चलाता हूं। सेवा एक स्थानसूची है और LocationManager से अपडेट का अनुरोध करता है। जब इसे स्थान मिलता है (ऑनलाक्शन चेंज()), यह स्वयं को श्रोता के रूप में हटा देता है और समन्वयक को सर्वर पर भेजता है। यह सब काम कर रहा है।
हालांकि, अगर जीपीएस निर्देशांक जल्दी से उपलब्ध नहीं हैं, तो मेरी सेवा तब तक चलती रहती है जब तक कि कुछ न हो जाए। यह एक प्रगति संवाद के साथ यूआई रखता है, जो परेशान है। इससे भी बदतर, यदि उपयोगकर्ता सेवा शुरू करने के बाद से स्थानांतरित हो गया है, तो पहला जीपीएस निर्देशांक गलत हो सकता है और ऐप सर्वर को खराब डेटा भेज देगा।
मुझे सेवा पर एक टाइमआउट चाहिए। क्या ऐसा करने का कोई अच्छा तरीका है? मैं धागे के साथ बहुत अनुभवी नहीं हूँ। मुझे लगता है कि मैं ऑनस्टार्ट कमांड() विधि में एक रननेबल चला सकता हूं जो किसी भी तरह 30 सेकंड नीचे गिना जाएगा और फिर, यदि कोई जीपीएस परिणाम नहीं है, तो मेरी सेवा की रोक() विधि को कॉल करें। क्या यह ऐसा करने का सबसे अच्छा तरीका है?
वैकल्पिक रूप से, क्या यह बताना संभव है कि जीपीएस ठीक नहीं हो सकता है? मुझसे यह कैसे होगा?
संपादित करें: आगे स्पष्टीकरण के लिए, मैं कुछ समय के बाद स्थान प्राप्त करने के लिए "छोड़ने" का सबसे अच्छा तरीका ढूंढ रहा हूं।
public class AddCurrentLocation extends Service implements LocationListener {
Application app;
LocationManager mLocManager;
ProgressDialog mDialog;
@Override
public int onStartCommand(Intent intent, int arg0, int arg1) {
app = getApplication();
// show progress dialog
if (app.getScreen() != null) {
mDialog = ProgressDialog.show(app.getScreen(), "", "Adding Location. Please wait...", true);
}
// find GPS service and start listening
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
mLocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
String bestProvider = mLocManager.getBestProvider(criteria, true);
mLocManager.requestLocationUpdates(bestProvider, 2000, 0, this);
return START_NOT_STICKY;
}
private void stop() {
mLocManager.removeUpdates(this);
if (mDialog != null) {
mDialog.dismiss();
}
stopSelf();
}
@Override
public void onLocationChanged(Location location) {
// done with GPS stop listening
mLocManager.removeUpdates(this);
sendLocation(location); // method to send info to server
stop();
}
// other required methods and sendLocation() ...
}
तो इस समाधान को हल करने के बाद आप क्या करते थे? मेरी भी यही समस्या है। – sexitrainer