0

我正在尝试使用 Apache HTTPClient 执行一个简单的获取请求,但是似乎 HTTPResponse response = client.execute(get); 之后的所有代码 正在被跳过。我无法访问响应对象的内容,它们都是空的。但是,当我使用调试模式并探索对象时,我会看到所有数据。这个函数被包装在一个异步任务中,所以我想知道任务本身并没有等待它被执行或者我不确定。

这里发生了类似的事情: httpclient.execute(httpget) 之后的 Android 代码没有在 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,就像我尝试从 response.getStatusCode() 这样的响应中获取值时,似乎代码死了,只返回 null。

4

1 回答 1

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 的项目,它在上一次 Google IO 会议上进行了演示。它还为您处理所有异步操作,并使您能够完成所有这些事情。我不太确定的一件事是它是否能让您解析后台线程中的响应。

我强烈建议您使用其中之一,因为它们可能会为您节省大量时间。如果您确实想继续使用您的代码,那么我建议首先调查您是否跳过了某些“if”块,使用调试器或添加日志消息以查看它是否进入块。一步一步走,看看哪里出了问题。我在我的项目中做类似的事情,看看这个文件: https ://github.com/darko1002001/android-rest-client/blob/master/android-rest-lib/src/main/java/com/dg/ libs/rest/client/BaseRestClient.java

于 2013-10-07T19:54:45.017 回答