我在Android应用程序中有一个登录视图,我想同步运行。也就是说,我希望用户留在页面上,直到登录休息呼叫完成。如果失败,用户可以重新输入他们的ID和密码。如果成功,他们将被路由到欢迎页面。
Retrofit提供了如何进行同步调用的示例。但它附带一条警告,“同步请求会在Android 4.0或更新版本上触发应用程序崩溃。您将遇到NetworkOnMainThreadException
错误。”我已经在stackoverflow上看到了各种各样的反应,包括使用Otto和Robospice。其他人使用自己开发的侦听器和其他人来使用同步请求。
实现此功能的最简单,最安全的方法是什么。
答案 0 :(得分:0)
如果您在改造中运行同步调用,则应用程序将在Android 4.0或更高版本上崩溃。您会遇到NetworkOnMainThreadException
错误。同步方法提供了直接使用返回值的功能,因为该操作会在您的网络请求期间阻止其他所有操作。
对于非阻塞UI,您必须自己在单独的线程中处理请求执行。这意味着,您仍可以在等待响应时与应用程序本身进行交互。参考:enter link description here
答案 1 :(得分:-3)
您不需要同步请求来实现此目标。
同步请求在主线程上执行。在android中,主线程用于绘制UI,因此在该线程上执行网络请求将阻止您的UI,因此Android会引发异常。
异步请求在单独的线程中执行网络连接,并使用回调将信息传递回主线程。这就是你需要的。
以下是使用Retrofit的示例代码在您的案例中的样子
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)
}
}