c# एंड्रॉइड में मैं एक जीपीएस स्थान अपडेट सिंक्रोनसन कैसे प्राप्त करूं?



android gps (1)

विशेष रूप से मैं Xamarin.Forms का उपयोग कर सी # विकास कर रहा हूं, हालांकि, मूल एंड्रॉइड की ओर से जीपीएस रैपर वर्ग लिखने पर काम कर रहा है जो कि Xamarin.Forms के पक्ष में निर्भरता इंजेक्शन के माध्यम से उपयोगी होगा। अधिकांश भाग के लिए एंड्रॉइड के संबंध में कॉल्स सी # और जावा के बीच समान होना चाहिए।

अनिवार्यतः, मेरे पास इस विधि है कि मेरे जियोलोकेटर ऑब्जेक्ट (जो इलोकेशन लिस्टनर को लागू करता है) एंड्रॉइड की तरफ है:

public async Task<Tuple<bool, string, GPSData>> GetGPSData() {
        gpsData = null;
        var success = false;
        var error = string.Empty;

        if (!manager.IsProviderEnabled(LocationManager.GpsProvider)) {
            //request permission or location services enabling
            //set error
        } else {
            manager.RequestSingleUpdate(LocationManager.GpsProvider, this, null);
            success = true;
        }

        return new Tuple<bool, string, GPSData>(success, error, gpsData);
 }

तथा

 public void OnLocationChanged(Location location) {
        gpsData = new GPSData(location.Latitude, location.Longitude);
    }

मैं GetGPSData को कॉल करने में सक्षम होना चाहता हूं और यह ट्यूपल को वापस लेना चाहता हूं, जो अब ट्यूपल के बारे में एकमात्र महत्वपूर्ण बात है जीपीएसएडा भर में है। मुझे पता है कि इसे ठीक करने के लिए सेकंड्स ले सकते हैं, इसलिए मैं इस विधि को async और Xamarin.Forms पक्ष में प्रतीक्षा करने के बाद मैं वास्तव में मूल्य की जरूरत है।

मेरी समस्या यह है कि मैं मैनेजर बनने का एक तरीका समझ नहीं पा रहा हूं। अनुरोध सिंक्रोनस या काम के चारों ओर आप उस विधि को कॉल करते हैं, और तब अंततः ऑनलाकॉन्स चेंजेड से ऑफ फायर होते हैं। मैंने एक घृणित, जंगली, फेंकने की कोशिश की

 while (gpsData == null);

कॉल करने के बाद इसे चालू रखने के लिए मजबूर करने के लिए जब तक OnLocationChanged निकाल दिया गया नहीं था, लेकिन जब मैंने उस रेखा को रखा था, तब ऑनलाकेशनल बदल गया कभी नहीं कहा जाता था। मैं यह मान रहा हूँ क्योंकि एक पृष्ठभूमि धागा होने के बजाय वही थ्रेड पर OnLocationChanged लागू किया गया है।

क्या इस परिदृश्य को लेकर मेरे लिए कोई रास्ता है और क्या GetGPSData को तब तक नहीं लौटाया जब तक OnLocationChanged निकाल दिया गया है?

धन्यवाद

संपादित करें: जोड़ने के लिए, इस विधि को नियमित रूप से फोन नहीं किया जाएगा। यह सहज और दुर्लभ है, इसलिए मैं RequestLocationUpdates का उपयोग नहीं करना चाहता, नियमित अपडेट प्राप्त करता है और सबसे हाल ही में एक लौटता हूं क्योंकि इसकी आवश्यकता होती है कि हमेशा जीपीएस चालू हो, जबकि बैटरी बेकार होती रहती है


आप क्या कर सकते हैं आप एक TaskCompletionSource साथ चाहते हैं। मेरे पास एक ही समस्या थी और इसी तरह मैंने इसे हल किया:

TaskCompletionSource<Tuple<bool, string, GPSData> tcs;
// No need for the method to be async, as nothing is await-ed inside it.
public Task<Tuple<bool, string, GPSData>> GetGPSData() {
    tcs = new TaskCompletionSource<Tuple<bool, string, GPSData>>();
    gpsData = null;
    var success = false;
    var error = string.Empty;

    if (!manager.IsProviderEnabled(LocationManager.GpsProvider)) {
        //request permission or location services enabling
        //set error
        tcs.TrySetException(new Exception("some error")); // This will throw on the await-ing caller of this method.
    } else {
        manager.RequestSingleUpdate(LocationManager.GpsProvider, this, null);
        success = true;
    }

    //return new Tuple<bool, string, GPSData>(success, error, gpsData); <-- change this to:
    return this.tcs.Task;
}

तथा:

public void OnLocationChanged(Location location) {
        gpsData = new GPSData(location.Latitude, location.Longitude);
        // Here you set the result of TaskCompletionSource. Your other method completes the task and returns the result to its caller.
        tcs.TrySetResult(new Tuple<bool, string, GPSData>(false, "someString", gpsData));
    }




xamarin.forms