我正在尝试使用Apache HTTPClient执行简单的get请求,但似乎所有代码都在HTTPResponse响应之后= client.execute(get);正被跳过。我无法访问响应对象的内容,它们都是null。但是,当我使用调试模式并浏览对象时,我会看到所有数据。这个函数包含在一个异步任务中,所以我想知道任务本身并没有等待它被执行或者我不确定。
这里发生了类似的事情: Android code after httpclient.execute(httpget) doesn't get run in try (using AsyncTask)
这是代码。
@Override
public T execute()
{
utils = new GeneralUtils();
if(getURL() == null)
{
throw new NullPointerException("No path specified");
}
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(getURL());
Log.e(TAG,"client created");
if(getHeaders()!=null)
{
Log.e(TAG,"client created");
for(Map.Entry<String,String> header:getHeaders().entrySet())
{
get.addHeader(header.getKey(),header.getValue());
}
}
try
{
HttpResponse response = client.execute(get);
Log.e(TAG,"executed");
if(response==null)
Log.v(TAG,"its null as heell");
Log.v(TAG,response.getStatusLine().getReasonPhrase());
Log.v(TAG,String.valueOf(response.getStatusLine().getStatusCode()));
Log.e(TAG,getURL());
Log.v(TAG,"everything else is dead");
for(Header header:response.getAllHeaders())
{
Log.v(TAG,header.getName()+" "+header.getValue());
}
if(response.getStatusLine().getStatusCode() == 200)
{
if(response.getEntity().getContent()!=null)
{
try
{
if(utils.isExternalStorageWritable())
{
String path = getContext().getFilesDir().getAbsolutePath()+"/"+getFileCategory()+"/" +getAlarmId()+getFileExtension();
media = new File(path);
/**
* if the directory has not being created this function does the creation.
*/
media.mkdirs();
FileOutputStream fileOutputStream = new FileOutputStream(media);
IOUtils.copy(response.getEntity().getContent(),fileOutputStream);
fileOutputStream.close();
Log.e(TAG,media.getAbsolutePath());
return (T)media;
}
return null;
}
catch (ClientProtocolException e)
{
Log.v(TAG,e.getMessage());
}
catch (IOException e)
{
Log.v(TAG,e.getMessage());
}
}
}
}
catch (IOException e)
{
Log.e(TAG, e.getCause().getMessage());
e.printStackTrace();
}
return null;
}
代码没有抛出任何异常,因此我不确定发生了什么。 响应对象之后的所有代码都不起作用。它只返回null,因为一旦我尝试从响应中获取一个值,就像响应.getStatusCode(),似乎代码已经死了,只返回null。
答案 0 :(得分:0)
为什么不使用可以处理所有这些宁静连接的库?
我会推荐一对夫妇:
https://github.com/darko1002001/android-rest-client(这是我的,我必须先提一下:)。我为我构建的项目构建了这个库。对于您的情况,您将提供一个解析器,它将为您提供一个InputStream,您只需将其保存为文件(就像现在使用IO utils一样)。它处理整个事物的异步部分,通常为您提供组织代码的好方法。
http://square.github.io/retrofit/ - 是我一直在玩的另一个。我觉得它做得很好,应该可以随心所欲地做任何事情。
http://java.dzone.com/articles/android-%E2%80%93-volley-library - Volley是一个直接来自谷歌的项目,它在上届Google IO大会上进行了演示。它还为您处理所有异步操作,并使您能够执行所有这些操作。我不确定的一件事是它是否能让你在后台线程中解析响应。
我强烈建议您使用其中之一,因为它们可能会为您节省大量时间。 如果您确实想要继续使用您的代码,那么我建议首先调查一下&#34; if&#34;跳过您的块,使用调试器或添加日志消息以查看它是否进入块。一步一步走,看看出了什么问题。 我在我的项目中做了类似的事情,看看这个文件: https://github.com/darko1002001/android-rest-client/blob/master/android-rest-lib/src/main/java/com/dg/libs/rest/client/BaseRestClient.java