如何使用RxJava或Observables来监听不同类中的变量?

时间:2018-02-16 23:50:15

标签: java android retrofit retrofit2 rx-java2

我正在尝试登录Android应用。我的问题是,当我从Activity.java调用login时,Service.java方法使用来自Retrofit的call.enqueue,它是异步的。所以我无法等待并使用Activity.java方法中的响应(以便我可以处理接下来发生的事情)。

因此,我决定如果我可以设置某种类型的侦听器来捕获响应对象何时发生变化,那么我可以处理应用程序中接下来发生的事情。

我一直在研究RxJava,但没有看到我在多个类中工作或似乎实际工作正常的示例。有一些我可以应用的基本语法非常有用,这将允许我使用登录响应对象,以便我可以处理应用程序中接下来发生的事情。我没有和RxJava结婚,所以如果有一种不同的方法可以让我消费这个对象,我很好。谢谢!

GlobalData.java

public class GlobalData {
    public static LoginResponse globalResponse;
}

Activity.java

public class Activity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // Can I subscribe here and do some logic for when globalResponse changes?!?
    } 

    public void login() {
        // create login request object
        // ...

        // call service method
        LoginResponse response = service.loginMethod(request);

        // Can I await the async in loginMethod so that I run logic after the call?
    }
}

Service.java

public class Service implements ServiceInterface {
    @Override
    public loginMethod(LoginRequest request) {
        // Setup Retrofit for api call
        // ...
        Call<LoginResponse> call = apiService.login(request);

        // async call to get a response from the api for login
        call.enqueue(new Callback<LoginResponse>() {
            @Override
            public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) {
                GlobalData.globalResponse = response.body(); // updates global data variable with the response from login
            }
        }
    }
}

2 个答案:

答案 0 :(得分:0)

查看下一篇博客,了解如何使用Rx并一起改造

Rxjava&amp;改造:http://www.baeldung.com/retrofit-rxjava

如何订阅可观察对象:http://www.vogella.com/tutorials/RxJava/article.html#creating-observables-subscribing-to-them-and-disposing-them

我认为你可以继续登录流程

答案 1 :(得分:0)

public class Activity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // Can I subscribe here and do some logic for when globalResponse changes?!?

是的,但仅当您使用BehaviorSubject / BehaviorRelay时(我投票Relay,请参阅BehaviorRelay)。

所以你有

public class GlobalData {
    private GlobalData() {}

    public static LoginResponse globalResponse;
}

但它应该像

public class GlobalData {
    private GlobalData() {}

    public static BehaviorRelay<Optional<LoginResponse>> globalResponse = BehaviorRelay.createDefault(Optional.absent());
}

        public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) {
            LoginResponse login = response.body();
            if(login != null) {
                GlobalData.globalResponse.accept(Optional.of(response.body()); 
            }
        }

如果您隐藏中继并公开一个写入其中的方法,另一个将其显示为Observable<Optional<T>>,则会获得奖励。

无论如何现在你可以做到

Disposable disposable = GlobalData.globalResponse.subscribe((opt) -> {
    if(opt.isPresent()) {
        LoginResponse data = opt.get();
        // do whatever
    }
});