【问题标题】:Android Retrofit:onNext values needed in other classAndroid Retrofit:其他类中需要的onNext值
【发布时间】:2017-09-26 17:02:32
【问题描述】:

我将 Retrofit 与 Rx java 一起使用,并且我在 onNext 中获取身份验证令牌的值。根据 onNext 的结果,我必须通过在自定义标头中添加令牌来将数据发布到服务器。我应该将所有代码都写在 on next 中吗?有什么方法可以从 onNext 返回一个值,所以当值可用时?

public String getToken() {
    Retrofit retrofit = new Retrofit.Builder()
                        .baseUrl("https://abc.efg.com/")
                        .addConverterFactory(ScalarsConverterFactory.create())
                        .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                        .build();
                GetTokenInterface service = retrofit.create(GetTokenInterface.class);

                Observable<String> response_call = service.getToken1(setAPI_KEY, setaccesstoken);

                response_call.subscribeOn(Schedulers.newThread())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe(new Subscriber<String>() {
                            @Override
                            public void onCompleted() {

                                System.out.print("Complete");
                            }

                            @Override
                            public void onError(Throwable e) {

                                System.out.print("Fail");
                            }

                            @Override
                            public void onNext(String token) {
                                authentication_token = token; //getting correct value here
                            }
                        });
                return authentication_token;
    }

}

然后在另一个班级:

generated_token = getToken();

但是由于值不可用,我得到了 generate_token null 有没有办法在其中获取值?我必须使用这个值来发布,还是需要在 onNext() 中合并 post observable?

【问题讨论】:

    标签: android retrofit rx-android


    【解决方案1】:

    RxJava 代码是异步执行的。例如

    public class Foo {
    
        String value = "a";
    
        public String getFoo() {
            value = "a"; // This executes first
            Observable.just(value + "a")
                    .observeOn(Schedulers.io())
                    .subscribe(new Action1<String>() {
                        public void call(String v) {
                            value = v; // This is called later on IO thread.
                        }
                    }); // This creates the observable and schedules execution on IO thread.
            return value; // Return value "a"
        }
    }
    
    Foo foo = new Foo();
    foo.getFoo(); // Return a
    Thread.sleep(100);
    foo.getFoo(); // likley Return `aa` (depends upon how long the IO thread take to run)
    Thread.sleep(100);
    foo,getFoo(); // likley Return `aaa` (depends upon how long the IO thread take to run)
    

    如果您想从您的方法 getToken 中获取一个值,您可以返回 Observable&lt;String&gt; 如果您愿意,您也可以将令牌保存在您的类中,如下所示。

    public class TokenService {
    
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://abc.efg.com/")
                .addConverterFactory(ScalarsConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();
        GetTokenInterface service = retrofit.create(GetTokenInterface.class); // This should be done outside of the method for performance
    
        String savedToken;
    
        public Observable<String> refreshToken() {
            return service.getToken1(setAPI_KEY, setaccesstoken)
                    .subscribeOn(Schedulers.newThread())
                    .doOnNext(new Action1<String() {
                        public void call(String token) {
                            savedToken = token;
                        }
                    }) // Do want is needed with token
                    .observeOn(AndroidSchedulers.mainThread());
        }
    
        public String getSavedToken() {
            return savedToken;
        }
    
    }
    

    【讨论】:

    • @Developer 我更新了我的示例,用类替换了 lambdas
    • 谢谢。非常感谢您的帮助
    猜你喜欢
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 2016-11-08
    • 2016-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多