vute
2019-06-01 19:59
采纳率: 100%
浏览 3.1k

Android开发(使用Java)中 client.newCall(request).execute() 语句永久阻塞的问题

小白,开发安卓的小型app,希望使用http的post方法向云端服务器发送json文件,然后获取云端返回的json,以此实现相关操作(比如向服务器发送包含用户名和密码的json文件,然后接收返回的json文件,解析,决定是否允许登录)

由于楼主是学生,暂时付不起云主机的钱,所以和同伴一起在局域网内建立了一个服务器用来前期进行调试。可是在编写android端代码的时候,遇到了问题,就是老是阻塞在一个地方:execute()

下面是代码:

   //访问云端服务器,获得登录授权
    private boolean getAuthorization() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //创建Client对象
                    Log.d(debugTag, "创建Client对象");
                    OkHttpClient client = new OkHttpClient();
                    //创建request对象
                    Log.d(debugTag, "创建request对象");
                    Request request = new Request.Builder()
                            .url("http://10.0.2.2/data")
                            .build();
                    //创建response对象
                    Log.d(debugTag, "创建response对象");
                    Response response = client.newCall(request).execute();
                    //获取返回值
                    Log.d(debugTag, "获取返回值");
                    String data = response.body().string();
                    //打印
                }catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
        return false;
    }

这里同伴不在身边,所以就暂时在我电脑上用Apache搭了一个localhost

文件结构:

图片说明

data文件的内容:{ "UserName":"John" , "PassWord":"123123" }

用电脑访问的结果:

图片说明

用Postman访问结果:
图片说明
用手机模拟器的浏览器访问结果:

图片说明

都是没有问题的
但是用我自己写的代码访问就不行(上面代码在Android Studio的日志窗口的运行结果):
图片说明

可以发现只运行到了“创建response对象”那一步,之后的execute()永远阻塞住了

但是改一下上面代码的url,改成"https://api.github.com/markdown/raw"
运行就正常了!

图片说明
我的电脑防火墙已经全部关闭

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • vute 2019-06-02 14:51
    已采纳

    好吧,我们组这几天时间特紧,又不是这个专业的,没有必要花太大功夫。我就自问自答取消这个问题吧。

    已采纳该答案
    打赏 评论
  • dabocaiqq 2019-06-01 22:15
    1 打赏 评论

相关推荐 更多相似问题