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

发布于 2022-09-03 15:29:42 字数 1379 浏览 21 评论 0

在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线程的代码等待获取到这个值才继续执行

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

流绪微梦 2022-09-10 15:29:42

用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);
...
一曲爱恨情仇 2022-09-10 15:29:42

推荐rxjava+retrofit

动听の歌 2022-09-10 15:29:42
//方法一
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");

//当然,注意判空哦
千寻… 2022-09-10 15:29:42

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

瑕疵 2022-09-10 15:29:42

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

<逆流佳人身旁 2022-09-10 15:29:42

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文