我尝试使用最简单的代码从Android应用程序调用Web API REST方法,而我找到的代码here看起来很有希望:
public String callWebService(String requestUrl)
{
String deviceId = "Android Device";
HttpClient httpclient = new DefaultHttpClient();
HttpGet request = new HttpGet(requestUrl);
request.addHeader("deviceId", deviceId);
ResponseHandler handler = new BasicResponseHandler();
String result = "";
try
{
result = httpclient.execute(request, handler); // <= a line too far
}
catch (ClientProtocolException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
httpclient.getConnectionManager().shutdown();
return result;
}
然而,它不会编译,告诉我:&#34;不兼容的类型:对象无法转换为String&#34;在这一行:
result = httpclient.execute(request, handler);
它试图绕过logjam提供了几个选项:
...但我不知道哪些选项(如果有的话)是解决这一难题的首选方式。是一种方式&#34;方式&#34;?
正如我所说,这段代码看起来很有希望,但我觉得它基本上无法使用,因为它给了我可怕的&#34; NetworkOnMainThreadException &#34;来自logcat:
04-01 13:18:41.861 1267-1267/hhs.app E/AndroidRuntime﹕ FATAL EXCEPTION: main
. . .
java.lang.IllegalStateException: Could not execute method of the activity
. . .
Caused by: java.lang.reflect.InvocationTargetException
. . .
Caused by: android.os.NetworkOnMainThreadException
答案 0 :(得分:6)
因为你在
中使用原始类型ResponseHandler handler = ...
对于原始类型,方法声明中的类型变量将被删除。因此,所有内容都显示为Object
(或类型参数的最左边界限)。
相反,请使用参数化类型
ResponseHandler<String> handler = ...
这也有效,因为BasicResponseHandler
扩展了ResponseHandler<String>
。
现在
httpclient.execute(request, handler);
将具有与声明handler
时使用的类型参数关联的返回类型,String
因此可以将结果分配给String
变量(或String
变量{{1}预期1}}。
答案 1 :(得分:1)
试试这个:
result = httpclient.execute(request, handler).toString();
如果我没错,你应该可以使用&#34; toString&#34;将execute方法的返回值转换为String类型的方法。