怎样才能在UI线程中等待okhttp返回结果才进行下一步

在onCreate()方法中的代码如下:

kHttpClient mOkHttpClient = new OkHttpClient();
RequestBody mRequestBody = new FormBody.Builder().add("imei",imei).build();
        Request mRequest = new Request.Builder().post(mRequestBody).url(url).build();
        mOkHttpClient.newCall(mRequest).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (response.code() == 404){
                    Log.d(logTag,"请求缺少IMEI参数");
                }
                else if (response.code() == 405){
                    Message message = new Message();
                    message.what = 3;
                    handler.sendMessage(message);
                }else if (response.body().string() == "IMEIForbidden"){
                    Message message = new Message();
                    message.what = 4;
                    handler.sendMessage(message);
                }

                String version = response.body().string();


            }
        });
        

我想要的逻辑是这样的:
从一个URL接口中获取一个String值(上述代码中的version),获取到version值后再去调用下一个接口。
在安卓中网络请求得开线程,所以就用了okhttp的enqueue方法,可是在这个方法中获取到的response值,怎么传递到UI线程中呢,并且让UI线程的代码等待获取到这个值才继续执行

阅读 9.2k
6 个回答

用Handler:

//在onCreate()方法外定义一个Handler :
Handler myHandler = new Handler() {  
    public void handleMessage(Message msg) {   
        switch (msg.what) {   
            case UI_OPRATION:   
                doSomething();  
                break;   
        }   
        super.handleMessage(msg);   
    }   
};
     
//调用处
...
String version = response.body().string();
myHandler.sendMessage(UI_OPRATION);
...

推荐rxjava+retrofit

//方法一
message.obj = version;

//方法二
Bundle bundle = new Bundle();
bundle.putCharSequence("你的KEY",version);
message.setData(bundle);

//UI里的handle里面用
Bundle bundle = message.getData();
String version = bundle.getCharSequence("你的KEY");

//或者直接
String version = message.getData().getCharSequence("你的KEY");

//当然,注意判空哦
新手上路,请多包涵

不贴代码,只讲一下思路。
本来呢,异步进行网络请求,除了避免anr之外,还有一个重要的原因那就是实现并行操作。而你想要的效果其实是同步执行的效果。
所以实现方式就是handler处理数据,另外用一个loading view来隔离用户操作。拿到回调之后再处理。

你请求到数据后直接把versionmsg.obj=version装进去,然后在OnCreate中handleMessage(Message msg)获取version再继续异步请求数据就可以啦啊

楼上几个答案都不错了。我额外来一下,square家族里okhttp非常好用,如果加上家族本身的retrofit就更加好用了,Retrofit+Rx对于线程间的处理非常良好,异常处理也非常好。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题