2016-05-10 130 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; 
} 

干杯!

相关问题