当前位置: 首页 > 知识库问答 >
问题:

Apache HTTPget在Android中行为怪异

戈宏义
2023-03-14

我试图使用Apache HTTPClient执行一个简单的get请求,但是看起来好像所有的代码在HTTP响应=client.execute(get);被跳过。我无法访问响应对象的内容,它们都是空的。然而,当我使用调试模式,我探索的对象,我看到所有的数据。这个函数被包装在一个异步任务中,所以我想知道任务本身是否在等待它被执行或者我不确定的事情。

这里也发生了类似的事情:httpclient之后的Android代码。执行(httpget)未在try中运行(使用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。

共有1个答案

酆光熙
2023-03-14

为什么不使用一个能处理所有这些restful连接的库呢?

我想推荐几款:

https://github.com/darko1002001/android-rest-client(这是我的我得先提一下:)。我为我建立的项目建立了这个库。对于您的情况,您将提供一个解析器,它将为您提供一个InputStream,您只需将其保存为文件(就像您现在使用IO utils一样)。它处理整件事的异步部分,通常为您提供一种组织代码的好方法

http://square.github.io/retrofit/-是我一直在玩的另一个。我认为它做得很好,应该可以用它做任何你想做的事情。

http://java.dzone.com/articles/android-––volley library–volley是一个直接从谷歌推出的项目,在上一次谷歌IO会议上进行了演示。它还为您处理所有异步操作,并使您能够完成所有这些操作。有一件事我不是很确定,那就是它是否能让你在后台线程中解析响应。

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

 类似资料:
  • 我试图在Android活动中动态创建并移动图像。然而,setX()和setY()方法似乎无法正常工作。第一次创建和放置图像时,它会正确设置图像的位置,但任何更新图像的尝试都会导致图像放置在错误的位置。例如,图像在以下代码上移动: 在动作_MOVE时,即使x和y位置值保持不变,图像也会移动。图像的父对象保持不变。大小保持不变。如果我得到x和y值,它仍然会说206,但它不再位于活动的(206206)处

  • 我的约束布局的版本是。在我的布局中包含了一个工具栏之后,工具栏的左右两边都有空间,如下图所示 这是我的工具栏的代码 我以以下方式将其包含在我的布局中 我没有在布局文件的根元素中使用任何附加的填充或边距。 另一个奇怪的事情是,如果我编译或构建程序,我的代码会自动改变,比如 更改为

  • 我正在设计一个网站,有一些h3标题和段落,包装在一个名为“featured-info”的div类中。此外,我还有一个footer元素,它位于主体中的主包装器中。各段用斜体字写成: 并且页脚有边框: 页脚文本也是一个h4向上感知: 主要的问题是我有一个设置:@media screen和(最小宽度:750px),它使一些导航按钮内联,并调整一些文本的大小,但是...当页面大小小于750px时,页脚样式

  • 我在http://www.nodebeginner.org上读了一篇教程,我在数据输出中有一个奇怪的行为。我知道,Stackoverflow也有类似的问题,但没有答案。所以我有这个Web-Server的代码: 调用RequestHandler.Upload的Router.js代码-我的buggy函数 和RequestHandler.Upload的代码 假设POST数据中有一个字符串。该函数的第一行

  • 当我第一次使用谷歌帐户登录,然后使用帐户登录时,Firbase返回“ERROR _ Account _ EXISTS _ WITH _ DIFFERENT _ CREDENTIAL ”,这是正确的,因为我从firebase控制台禁用了签署多凭据选项。 当我第一次使用帐户登录时出现问题。提供商是正确的,UserInfo显示facebook用户帐户信息。但是电子邮件没有被验证。 当我登录谷歌账户时,出

  • 我有以下代码来解析一个JSON文件: 要处理以下JSON文件: 如果我执行此代码,我将收到以下错误: 所以我开始一步一步地调试应用程序,看看part processing()中的哪个代码部分抛出了这个异常。令人惊讶的是,那里的所有代码都正常执行:没有抛出异常,也没有返回结果I except。 更让我惊讶的是,当我稍微改变第一种方法的代码时,它可以在不产生异常的情况下工作。 我不知道println方