之间有什么区别:
Observable<String> observable = Observable
.interval(0, 1, TimeUnit.SECONDS)
.flatMap(new Func1<Long, Observable<String>>() {
@Override
public Observable<String> call(Long aLong) {
return Observable.just("MyString");
}
})
Run Code Online (Sandbox Code Playgroud)
和:
Observable<String> observable = Observable.just("MyString")
.repeatWhen(new Func1<Observable<? extends Void>, Observable<?>>() {
@Override
public Observable<?> call(Observable<? extends Void> completed) {
return completed.delay(1, TimeUnit.SECONDS);
}
})
Run Code Online (Sandbox Code Playgroud)
第二个是更清洁但实际上并考虑到背压,这两种解决方案的行为方式是否相同?
我想在昨天开始讨论我在Reddit Android Dev社区开始讨论的一个新问题:如何使用JodaTime库在已经过时的信息设备上管理应用程序附带的最新时区数据库?
手头的具体问题涉及特定的时区,"欧洲/加里宁格勒".我可以重现这个问题:在Android 4.4设备上,如果我手动将其时区设置为上述时间,则呼叫new DateTime()会将此DateTime实例设置为手机状态栏上显示的实际时间前一小时的时间.
我创建了一个示例Activity来说明问题.在它上面onCreate()我称之为:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ResourceZoneInfoProvider.init(getApplicationContext());
ViewGroup v = (ViewGroup) findViewById(R.id.root);
addTimeZoneInfo("America/New_York", v);
addTimeZoneInfo("Europe/Paris", v);
addTimeZoneInfo("Europe/Kaliningrad", v);
}
private void addTimeZoneInfo(String id, ViewGroup root) {
AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
am.setTimeZone(id);
//Joda does not update its time zone automatically when there is a system change
DateTimeZone.setDefault(DateTimeZone.forID(id));
View v = getLayoutInflater().inflate(R.layout.info, root, false);
TextView idInfo = (TextView) v.findViewById(R.id.id);
idInfo.setText(id);
TextView …Run Code Online (Sandbox Code Playgroud)