2017-02-13 18 views
0

Ich möchte eine Hilfsklasse machen, die die Geocoding und ReverseGeoCoding in meiner App behandelt.Xamarin Forms GetAddressesForPositionAsync

Meine Herausforderung besteht darin, dass die folgende Codezeile nicht wirklich auf das Ergebnis des Aufrufs wartet.

var possibleAddresses = await iobj_Geocoder.GetAddressesForPositionAsync(pobj_Position); 

Die Steuerung wird an den anrufenden Ereignis zurückgegeben, bevor die Adresse Ergebnisse abgerufen werden. Irgendeine Hilfe, wie man diese Arbeit macht, würde sehr geschätzt werden.

Hilfe Klassencode:

using System.Linq; 
using Xamarin.Forms.Maps; 

namespace MapProblems 
{ 
    public class MapHelper 
    { 
     private Geocoder iobj_Geocoder; 
     public string Address { get; set; } 

     public MapHelper() 
     { 
      iobj_Geocoder = new Geocoder(); 
     } 

     public async void GeoCodeAddress(Position pobj_Position) 
     { 

      var possibleAddresses = await iobj_Geocoder.GetAddressesForPositionAsync(pobj_Position); 

      Address = possibleAddresses.ToList()[0]; 
     } 

    } 
} 

Hauptseite, die die Hilfsklasse C# Datei ruft:

using System; 
using System.Diagnostics; 
using Xamarin.Forms; 
using Xamarin.Forms.Maps; 
namespace MapProblems 
{ 
    public partial class MainPage : ContentPage 
    { 
     MapHelper iobj_MapHelper; 
     public MainPage() 
     { 
      InitializeComponent(); 
      iobj_MapHelper = new MapHelper(); 
      this.Appearing += MainPage_Appearing; 

     } 

     private async void MainPage_Appearing(object sender, EventArgs e) 
     { 
      Device.BeginInvokeOnMainThread(() => 
      { 
       iobj_MapHelper.GeoCodeAddress(new Position(38.9047, -077.0310)); 
      } 
      ); 

      Debug.WriteLine("Address: " + iobj_MapHelper.Address); 
     } 
    } 
} 

So ist das Endergebnis dieses Beispiels ist Adresse jede leere Zeichenfolge, wenn die Debug.WriteLine Code wird ausgeführt.

Jede Hilfe wäre sehr willkommen.

Antwort

1

Da Ihre GeoCodeAddress-Methode async void ist, kann Ihr Code nicht wissen, wann er fertig ist. Probieren Sie es ein asynchrones Aufgabe machen:

public async Task<string> GeoCodeAddress(Position pobj_Position) 
{ 
    var possibleAddresses = await iobj_Geocoder.GetAddressesForPositionAsync(pobj_Position); 
    return possibleAddresses.ToList()[0]; 
} 

Dann können Sie es nennen wie so:

private async void MainPage_Appearing(object sender, EventArgs e) 
{ 
    var address = await iobj_MapHelper.GeoCodeAddress(new Position(38.9047, -077.0310)); 
    Debug.WriteLine("Address: " + address); 
} 

Also, stellen Sie sicher, dass Sie try/catch in den Asynchron Leere Methoden, wie Ausnahmen dort abstürzen Ihre App, wenn sie nicht behandelt werden.

+0

Ich habe bereits versucht, was Sie vorgeschlagen haben und es hat nicht funktioniert, aber ich werde es erneut versuchen und Sie wissen lassen. –

+0

OK, das hat funktioniert und es hat einen Defekt, den ich bei MS eingereicht habe. Wenn Sie den obigen Code auf dem Windows Phone 8.1-Emulator ausführen, erhalten Sie für jedermanns Wissen 1 Adresse zurück. Wenn Sie es auf dem Windows 10 Mobile-Emulator ausführen, erhalten Sie Nulladressen zurück. Die App, die ich erstellt habe, ist eine Windows Phone 8.1 App. –