如何在Android上使用Retrofit进行同步通话

时间:2017-06-21 01:45:57

标签: android rest retrofit robospice otto

我在Android应用程序中有一个登录视图,我想同步运行。也就是说,我希望用户留在页面上,直到登录休息呼叫完成。如果失败,用户可以重新输入他们的ID和密码。如果成功,他们将被路由到欢迎页面。

Retrofit提供了如何进行同步调用的示例。但它附带一条警告,“同步请求会在Android 4.0或更新版本上触发应用程序崩溃。您将遇到NetworkOnMainThreadException错误。”我已经在stackoverflow上看到了各种各样的反应,包括使用Otto和Robospice。其他人使用自己开发的侦听器和其他人来使用同步请求。

实现此功能的最简单,最安全的方法是什么。

2 个答案:

答案 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)

    }
}