我知道有很多关于OkHttp的教程,但基本上所有的教程都在onResponse方法中做了一些不同的事情,大多数都没有费心解释为什么。有些人检查if (response.isSuccessful),有些人用try/catch包围它,有些人根本不做这些事情。
这是我的示例项目。处理onResponse方法的正确方式是什么?
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);
}
});
}
});
}}
发布于 2017-12-21 19:39:17
补充来自rafid的答案。基本上,您需要检查三个案例。
response.isSuccessful()网络状态代码介于200和300response.code() =>之间,用于在响应后手动检查not successfulonFailure() => =>错误或解析错误等。理想情况下,您的回调将处理这些情况,例如
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方法的回调。
发布于 2017-12-21 19:32:42
编辑:更清楚地说。
回调在mainThread中运行,因此不需要调用runOnUiThread。如果响应不成功,可以尝试解析错误正文,如下所示。如果响应成功,您可以使用Gson进行解析,如我所示。
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类。然后你可以像下面这样解析正文
Gson gson = new Gson();
MyPojo myPojo = gson.fromJson(response.body().charStream(), MyPojo.class);发布于 2017-12-21 20:24:13
我认为你需要确保你知道来自请求的合法响应,比如json或File。如果它只是一个json,请使用如下所示:
@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);
}
});
}
}https://stackoverflow.com/questions/47923878
复制相似问题