2016-05-10 154 views
0

我在Xamarin.Android中構建應用程序!它在給定經緯度時使用Google地圖API確定我的地址。但是,我的應用程序未能提供HTTP響應。我沒有收到任何運行時錯誤,VS調試器的行爲就像我的應用程序已被掛起一樣。HTTP響應永遠不會返回

1>我不知道這是否是因爲我讀somehwere它可能是阻塞,異步代碼的問題Xamarin.Android

2>的一個問題,但然後我使用相同的代碼我的Windows應用程序,它從來沒有給我麻煩

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Net.Http; 
using System.Runtime.Serialization; 
using System.Runtime.Serialization.Json; 
using System.Text; 
using System.Threading.Tasks; 

namespace App_Code 
{ 
public class myLocationProxy 
{ 
    public static async Task<RootObject_AutoLocationAddress> getmyLocation(string lat, string lng) 
    { 


     var http = new HttpClient();  
     /*CODE STOPS HERE*/var response = await http.GetAsync(String.Format("http://maps.google.com/maps/api/geocode/json?latlng={0},{1}&sensor=false", Uri.EscapeDataString(lat), Uri.EscapeDataString(lng)));   
     var result = await response.Content.ReadAsStringAsync(); 
     var serializer = new DataContractJsonSerializer(typeof(RootObject_AutoLocationAddress)); 

     var ms = new MemoryStream(Encoding.UTF8.GetBytes(result)); 

     var data = (RootObject_AutoLocationAddress)serializer.ReadObject(ms); 

     return data; 
    } 
} 


[DataContract] 
public class AddressComponent_AutoLocationAddress 
{ 
    [DataMember] 
    public string long_name { get; set; } 
    [DataMember] 
    public List<string> types { get; set; } 
} 
[DataContract] 
public class Result_AutoLocationAddress 
{ 
    [DataMember] 
    public List<AddressComponent_AutoLocationAddress> address_components { get; set; } 
    [DataMember] 
    public string formatted_address { get; set; } 

} 
[DataContract] 
public class RootObject_AutoLocationAddress 
{ 
    [DataMember] 
    public List<Result_AutoLocationAddress> results { get; set; } 
    [DataMember] 
    public string status { get; set; } 
} 
} 
+1

你怎麼稱之爲異步方法?嘗試在您等待的對'HttpClient'的調用中添加'.ConfigureAwait(false);'。 – Cheesebaron

+0

@ Cheesebaron奇怪我前一陣子試過了,它沒有工作。謝謝隊友 –

+0

你確定它沒有回來嗎?因爲我的經驗,當Xamarin.Android請求失敗時,最多可能需要3分鐘才能結束請求... – Gusman

回答

0

嘗試下面的代碼片段只是增加TimeOut價值。

public static async Task<RootObject_AutoLocationAddress> getmyLocation(string lat, string lng) 
{ 
     var client = new HttpClient() 
     { 
     Timeout = TimeSpan.FromMilliseconds(10000) //10 second, This line might help you 
     }; 

     var response = await client.GetAsync(String.Format("http://maps.google.com/maps/api/geocode/json?latlng={0},{1}&sensor=false", Uri.EscapeDataString(lat), Uri.EscapeDataString(lng)));   
     var result = await response.Content.ReadAsStringAsync(); 
     var serializer = new DataContractJsonSerializer(typeof(RootObject_AutoLocationAddress)); 

     var ms = new MemoryStream(Encoding.UTF8.GetBytes(result)); 

     var data = (RootObject_AutoLocationAddress)serializer.ReadObject(ms); 

     return data; 
} 

乾杯!

相關問題