我想一个接一个地执行2个网络呼叫.两个网络调用都返回Observable.第二呼叫从所述第一呼叫的成功的结果使用数据,在第二个呼叫的成功的结果从方法使用数据两者第二呼叫的所述第一的成功的结果和.此外,我应该能够处理这两个 onError的"事件"是不同的.我怎样才能避免回调地狱,如下例所示:
API().auth(email, password)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<AuthResponse>() {
@Override
public void call(final AuthResponse authResponse) {
API().getUser(authResponse.getAccessToken())
.subscribe(new Action1<List<User>>() {
@Override
public void call(List<User> users) {
doSomething(authResponse, users);
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
onErrorGetUser();
}
});
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
onErrorAuth();
}
});
Run Code Online (Sandbox Code Playgroud)
我知道zip,但我想避免创建"Combiner类".
更新1. 试图实现akarnokd的答案:
API()
.auth(email, password)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.flatMap(authResponse -> API()
.getUser(authResponse.getAccessToken())
.doOnError(throwable -> {
getView().setError(processFail(throwable));
}), ((authResponse, users) …
Run Code Online (Sandbox Code Playgroud) 使用JacksonAnnotations和Android支持注释.我的POJO是:
@JsonIgnoreProperties(ignoreUnknown = true)
public class Schedule {
public static final int SUNDAY = 0;
public static final int MONDAY = 1;
public static final int TUESDAY = 2;
public static final int WEDNESDAY = 3;
public static final int THURSDAY = 4;
public static final int FRIDAY = 5;
public static final int SATURDAY = 6;
private Integer weekday;
public Schedule() {
}
@Weekday
public Integer getWeekday() {
return weekday;
}
public void setWeekday(@Weekday Integer weekday) {
this.weekday = …
Run Code Online (Sandbox Code Playgroud) 我的问题是我无法获得无限的流Retrofit
.在我获得初始poll()请求的凭证后 - 我做了初始poll()请求.如果没有更改,则每个poll()请求在25秒内响应,如果有任何更改,则每个poll()请求更早 - 返回changed_data [].每个响应都包含timestamp
下一个轮询请求所需的数据 - 我应该在每个poll()响应之后执行新的poll()请求.这是我的代码:
getServerApi().getLongPollServer()
.flatMap(longPollServer -> getLongPollServerApi(longPollServer.getServer()).poll("a_check", Config.LONG_POLLING_SERVER_TIMEOUT, 2, longPollServer.getKey(), longPollServer.getTs(), "")
.take(1)
.flatMap(longPollEnvelope -> getLongPollServerApi(longPollServer.getServer()).poll("a_check", Config.LONG_POLLING_SERVER_TIMEOUT, 2, longPollServer.getKey(), longPollEnvelope.getTs(), "")))
.retry()
.subscribe(longPollEnvelope1 -> {
processUpdates(longPollEnvelope1.getUpdates());
});
Run Code Online (Sandbox Code Playgroud)
我是RxJava的新手,也许我不明白,但我无法获得无限的流.我接到3个电话,然后是onNext和onComplete.
PS也许有更好的解决方案在Android上实现长轮询?
更新:当我把nullcheks(片段!= null,getActivity()!= null)放在我能做的时候崩溃了.
我的应用程序使用ViewPager(屏幕外限制5),并使用getSupportFragmentManager()初始化FragmentStatePagerAdapter.每个页面都有自己的片段和后台堆栈.
应用程序在启动时崩溃.问题仅发生在preLollipop设备和仿真器上.使用最新支持lbrary(尝试24.0.0也 - 相同结果)Stacktrace:
java.lang.IllegalStateException:在android.support的android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1267)的android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1267)处没有主机.v4.app.FragmentManagerImpl.dispatchCreate(FragmentManager.java:2138)位于android.support.v4.app.Fragment.onCreate(Fragment.java:1254)android.support.v4.app.Fragment.performCreate(Fragment.java) :2062)在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1051)的android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1286)android.support.v4.app上的android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1051). BackStackRecord.run(BackStackRecord.java:758)android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1632)at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:637)at android android.support.v4.view.ViewPager.pop上的.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:166)ulate(ViewPager.java:1237)位于android.sview的android.support.v4.view.ViewPager.populate(ViewPager.java:1085)android.sview.v4上的android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1611) .View.measure(View.java:16497)位于android.widget.Linout.measureVertical的android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)上的android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) LinearLayout.java:695)在android.view.measure.View.measure(View.java:16497)的android.widget.Linear.onMeasure(LinearLayout.java:588)android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) )在android.widget.FreeLayout.onMeasure(FrameLayout.java:310)的android.view.measure.View.measure(View.java:16497)android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:719)android.widget Android.widge上android.view.visionGroup.measureChildWargins(ViewGroup.java:5125)的android.view.View.measure(View.java:16497)的.RelativeLayout.onMeasure(RelativeLayout.java:455)t.FrameLayout.onMeasure(FrameLayout.java:310)位于android.view.view.measure(View.java:16497)android.view的android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:135) .ViewGroup.measureChildWithMargins(ViewGroup.java:5125)位于android.view.measure.View.measure(View.java:16497)的android.view.FreeLayout.onMeasure(FrameLayout.java:310),位于android.view.ViewGroup.measureChildWithMargins( ViewGroup.java:5125)在android.view.measure.View.measure(View.java:16497)的android.widget.FrameLayout.onMeasure(FrameLayout.java:310)android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) )在Android.widget.Lineout.measureVertical(LinearLayout.java:695)的android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)android.view上的android.widget.LinearLayout.onMeasure(LinearLayout.java:588) .View.measure(View.java:16497)位于android.widget.FrameLayout.onMeasure(FrameLayout.java:310)的android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)在com.android.internal.policy.impl.PhoneWindow $ DecorView.onMeasure(PhoneWindow.java:2291)的android.view.View.measure(View.java:16497)在android.view.ViewRootImpl.performMeasure(ViewRootImpl.java) :1912)在android.view.ViewRootImpl.measureHversy(ViewRootImpl.java:1291)的android.view.ViewRootImpl.measureHversal(ViewRootImpl.java:1291)android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:996) .view.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java:5600)在android.view.Choreographer $ CallbackRecord.run(Choreographer.java:761)的android.view.Choreographer.doCallbacks(Choreographer.java:574).在android.view.Handler的android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:747)的android.O. .dispatchMessage(Handler.java:95)在android.os.Looper.loop(Looper.java:136)
最新的V14偏好支持库.
API上的半透明主题 > 19
EditTextPreferenceCompat内PreferenceFragmentCompat
点击EditTextPreferenceCompat之后弹出EditTextPreferenceDialogFragmentCompat,其中控件与软键盘重叠,这是错误的:
我的JSON结构:
{
...
"type":"post", // Type could vary
"items":[] // Array of items, each item is typeOf("type")
...
}
Run Code Online (Sandbox Code Playgroud)
如何items
在我的POJO中反序列化并正确包裹列表:
public class ItemsEnvelope {
private String type;
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.EXTERNAL_PROPERTY,
property = "type",
visible = true)
@JsonSubTypes({
@JsonSubTypes.Type(value = A.class, name = "A"),
@JsonSubTypes.Type(value = B.class, name = "B"),
@JsonSubTypes.Type(value = C.class, name = "C")
})
private List<Item> items;
interface Item extends Parcelable {}
class A implements Item {
// Bunch of getters/setters and …
Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,需要会话(cookie)来处理网络电话.我正在使用Retrofit+RxJava
.但是,会话可能会过期(使用401 Unauthorized状态进行Retrofit错误)并且我想重新进行身份验证(以获取新的cookie)并在此情况下重试之前的呼叫.我该怎么做RxJava
?
我的例子:
getServerApi().getDialogs(offset, getCookies())
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.retryWhen(observable -> {...}) // Need some logic
.subscribe(dialogsEnvelope -> getView().setDialogs(dialogsEnvelope),
throwable -> getView().setError(processFail(throwable)));
Run Code Online (Sandbox Code Playgroud) 我有一个像这样的JSON对象:
{"geonames":[
{"countryId":"2017370",
"adminCode1":"73"},
{"countryId":"2027370",
"adminCode1":"71"},
...]}
Run Code Online (Sandbox Code Playgroud)
我怎样才能反序列化该对象直到List<GeoName>
,忽略所述第一层(GEONAMES包装器),而不是反序列化到含有包装对象List<GeoName>
为@JsonProperty("geonames")
?