为什么我会得到“不兼容的类型:对象无法转换为字符串”?

时间:2014-04-01 16:39:48

标签: java android android-studio http-get android-gradle

我尝试使用最简单的代码从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提供了几个选项:

enter image description here

...但我不知道哪些选项(如果有的话)是解决这一难题的首选方式。是一种方式&#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

2 个答案:

答案 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类型的方法。