首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我不知道要在OkHttp的onResponse方法中检查什么

我不知道要在OkHttp的onResponse方法中检查什么
EN

Stack Overflow用户
提问于 2017-12-21 19:21:52
回答 3查看 1.3K关注 0票数 3

我知道有很多关于OkHttp的教程,但基本上所有的教程都在onResponse方法中做了一些不同的事情,大多数都没有费心解释为什么。有些人检查if (response.isSuccessful),有些人用try/catch包围它,有些人根本不做这些事情。

这是我的示例项目。处理onResponse方法的正确方式是什么?

代码语言:javascript
运行
复制
public class MainActivity extends AppCompatActivity {

private TextView textViewResult;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    textViewResult = findViewById(R.id.text_view_result);

    OkHttpClient client = new OkHttpClient();

    String url = "https://reqres.in/api/users?page=2";

    Request request = new Request.Builder()
            .url(url)
            .build();

    client.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            e.printStackTrace();
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            final String myResponse = response.body().string();

            MainActivity.this.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    textViewResult.setText(myResponse);
                }
            });
        }
    });
}

}

EN

回答 3

Stack Overflow用户

发布于 2017-12-21 19:39:17

补充来自rafid的答案。基本上,您需要检查三个案例。

  1. response.isSuccessful()网络状态代码介于200和300
  2. response.code() =>之间,用于在响应后手动检查not successful
  3. onFailure() => =>错误或解析错误等。

理想情况下,您的回调将处理这些情况,例如

代码语言:javascript
运行
复制
client.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        // network error or parsing error
    }
    @Override
    public void onResponse(Call call, Response response) {
        if (response.isSuccessful()) {
            // do stuff all good
        } else {
            // handle different cases for different status codes or dump them all here
        }
    }
});

您需要try-catch的原因是因为OkHttp正在尝试解析响应。这就是response.errorBody().string();的例子。另一种情况是如果您的Callback<T>实际上有一个类型参数。同样,OkHttp将尝试解析对该类型的响应。如果失败,将导致对onFailure方法的回调。

票数 2
EN

Stack Overflow用户

发布于 2017-12-21 19:32:42

编辑:更清楚地说。

回调在mainThread中运行,因此不需要调用runOnUiThread。如果响应不成功,可以尝试解析错误正文,如下所示。如果响应成功,您可以使用Gson进行解析,如我所示。

代码语言:javascript
运行
复制
String message = "";
            if (response.errorBody() != null) {
                try {
                    message = response.errorBody().string();
                } catch (IOException ignored) {
                    Log.e("OkHttp IOException", "error while parsing response");
                }
                 Log.d("Error Message", message);   
            }

我推荐你使用Gson库。首先,您应该创建您的pojo类。您可以使用http://www.jsonschema2pojo.org/创建pojo类。然后你可以像下面这样解析正文

代码语言:javascript
运行
复制
  Gson gson = new Gson();
  MyPojo myPojo = gson.fromJson(response.body().charStream(), MyPojo.class);
票数 0
EN

Stack Overflow用户

发布于 2017-12-21 20:24:13

我认为你需要确保你知道来自请求的合法响应,比如jsonFile。如果它只是一个json,请使用如下所示:

代码语言:javascript
运行
复制
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                final String myResponse = response.body().string();
                if (response.isSuccessful() && !TextUtils.isEmpty(myResponse)) {
                    MainActivity.this.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            textViewResult.setText(myResponse);
                        }
                    });
                }
            }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47923878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档