在AsyncTask中使用URL的IllegalStateException

时间:2014-09-19 11:12:39

标签: android android-asynctask

我正在开发一个移动应用程序,我正在使用它来使用AsyncTask从我的API获取数据。问题是,当应用程序尝试连接到API时,我收到以下异常。

> Caused by: java.lang.IllegalStateException: Target host must not be
> null, or set in parameters. scheme=null, host=null,
> path=api.mywebsite.net/test

我认为这与我的网址中缺少http://有关,但即使我添加它,它也会显示上述异常。 这就是我创建HTTP请求的方式:

HttpClient httpClient = new DefaultHttpClient();
HttpResponse httpResponse = null;
HttpGet httpGet = new HttpGet("api.mywebsite.net/test");    
httpResponse = httpClient.execute(httpGet);

感谢您的帮助。

更新:从浏览器调用或通过我正在使用的某个REST测试工具访问时,原始网址返回有效json。在Chrome通过开发人员工具进一步检查request标头后,我发现请求的请求网址部分确实有http://

3 个答案:

答案 0 :(得分:1)

我认为这需要改变:

HttpGet httpGet = new HttpGet("http://www.api.mywebsite.net/test");

答案 1 :(得分:0)

  

java.lang.IllegalStateException:目标主机不能为null或set   在参数中。 scheme = null,host = null,path = api.fuelupapp.net / test

要解决此问题,您必须在网址中添加http://前缀。

此外,如果您对ui线程进行网络操作,您将获得Exception on NetworkTask:android.os.NetworkOnMainThreadException

我刚用下面的代码试过你的情况并且它有效。 new NetworkTask().execute();

private static class NetworkTask extends
        AsyncTask<Void, Void, HttpResponse> {

    @Override
    protected HttpResponse doInBackground(Void... params) {
        HttpResponse httpResponse = null;
        try {
            HttpClient httpClient = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet("http://api.fuelupapp.net/test");
            httpResponse = httpClient.execute(httpGet);
        } catch (Exception e) {
            Log.d("NetworkTask", "Exception on NetworkTask:" + e);
        }
        return httpResponse;
    }

    @Override
    protected void onPostExecute(HttpResponse httpResponse) {
        super.onPostExecute(httpResponse);

        if(httpResponse != null) {
            Log.d("NetworkTask", "NetworkTask response received");
        } else {
            Log.d("NetworkTask", "NetworkTask error occured");
        }
    }
}

答案 2 :(得分:0)

显然这是我自己的错。我没有在INTERNET中启用AndroidManifest权限,偷偷摸摸的Android没有向我显示这是一个错误。

无论如何,请确保在清单文件中启用<uses-permission android:name="android.permission.INTERNET"></uses-permission>