Android Retrofit:onNext 其他 class 中需要的值
Android Retrofit:onNext values needed in other class
我正在使用 Retrofit with Rx java 并且我在 onNext.Depending 中根据 onNext 的结果获取身份验证令牌的值我必须通过添加 post 数据到服务器自定义 header 中的令牌。我是否应该将所有代码都写在接下来的代码中,是否有任何方法可以 return 来自 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;
}
}
然后在另一个class:
generated_token = getToken();
但我得到 generated_token 空值,因为值不可用有什么方法可以从中获取值吗?我必须将此值用于 posting,或者我是否需要在 onNext() 中合并 post 可观察值?
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 中获取一个值,您可以 return Observable<String>
如果您愿意,您还可以将令牌保存在 class 中,如下所示。
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;
}
}
我正在使用 Retrofit with Rx java 并且我在 onNext.Depending 中根据 onNext 的结果获取身份验证令牌的值我必须通过添加 post 数据到服务器自定义 header 中的令牌。我是否应该将所有代码都写在接下来的代码中,是否有任何方法可以 return 来自 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;
}
}
然后在另一个class:
generated_token = getToken();
但我得到 generated_token 空值,因为值不可用有什么方法可以从中获取值吗?我必须将此值用于 posting,或者我是否需要在 onNext() 中合并 post 可观察值?
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 中获取一个值,您可以 return Observable<String>
如果您愿意,您还可以将令牌保存在 class 中,如下所示。
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;
}
}