如何在Android上使用Retrofit进行同步呼叫
问题描述:
我有一个android应用程序中的登录视图,我想同步运行。也就是说,我希望用户留在页面上,直到登录休息呼叫完成。如果失败,用户可以重新输入他们的ID和密码。如果成功,它们将被路由到欢迎页面。如何在Android上使用Retrofit进行同步呼叫
改造提供了如何进行同步调用的示例。但它带有一个警告:“同步请求触发Android 4.0或更新版本的应用崩溃,您将遇到NetworkOnMainThreadException
错误。”我已经看到了stackoverflow上的各种反应,包括使用Otto和Robospice。其他人可以使用本地收听者和其他人使用同步请求。
什么是最简单,最安全的方式来实现此功能。
答
您不需要同步请求来实现此目的。
在主线程上执行同步请求。在android中,主线程用于绘制UI,因此在该线程上执行网络请求会阻止您的UI,因此Android会引发异常。
异步请求在单独的线程中执行联网并且具有回调将信息传递回主线程。这是你需要的。
下面是使用改装的示例代码是什么样子,你的情况
call.enqueue(new Callback<LoginResponse>() {
@Override
public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) {
if (response.isSuccessful()) {
// status code 2xx. start welcome activity
} else {
// Recieved a response but not 2xx.
// Possibly authentication error. Show error message
}
}
@Override
public void onFailure(Call<LoginResponse> call, Throwable t) {
// request could not be executed (possibly no internet connection)
}
}
这是目前我在做什么。问题是如何将结果返回给我的调用片段。我可以传递片段的一个实例,但看起来可能不是最好的事情,因为片段可能会消失。或者我可以使用Otto或Robospice之类的东西,但看起来像是过度杀伤。另外,我希望登录屏幕上有一些表示身份验证正在进行,因此他们不会离开。 – user6627139
这就是'onResponse'的用途。它为您的呼叫活动/片段提供响应。你可以在'enqueue'调用之前显示一个不确定的'ProgressBar'并将它隐藏在'onResponse'块 – akash93
是的,我明白了。正如我所说,这就是我目前正在做的。我想把我的登录休息请求放在一个单独的类中(用于测试,重用等),所有逻辑都与发送和获取响应相关联,而不是在片段或活动中。然后让片段在我的休息服务类上调用一个方法,并在完成时收到通知。 – user6627139