我有两个可完成的.我想做以下场景:如果第一个Completable到达onComplete,继续第二个Completable.最终结果将是第二次完成的完成.
当我有单个getUserIdAlreadySavedInDevice()和Completable login()时,我就是这样做的:
@Override
public Completable loginUserThatIsAlreadySavedInDevice(String password) {
return getUserIdAlreadySavedInDevice()
.flatMapCompletable(s -> login(password, s))
}
Run Code Online (Sandbox Code Playgroud) 在Java中它就像:
layoutParams.setGravity(Gravity.END|Gravity.BOTTOM);
Run Code Online (Sandbox Code Playgroud)
如何在Kotlin做到这一点?
当使用rxjava 1.xi用于返回Observable<Void>
处理来自改造的空响应时:
@POST( "login" )
Observable<Void> getToken( @Header( "Authorization" ) String authorization,
@Header( "username" ) String username,
@Header( "password" ) String password );
Run Code Online (Sandbox Code Playgroud)
但是因为rxjava 2.x不会发出任何东西,Void
是否有任何好的做法来处理那些空的响应?
如何为应用程序在后台时出现的通知消息设置默认通知通道?默认情况下,这些消息使用"杂项"通道.
我需要提出两个服务请求并将其结合起来:
ServiceA()=> [{"id":1,"name":"title"},{"id":1,"name":"title"}]
ServiceB(id
)=> {"field":"value","field1":"value"}
目前,我已设法将结果组合在一起,但我需要将id
参数作为参数传递给ServiceB并获取对第一个结果的访问权限.
到目前为止我尝试了什么:
Retrofit repo = new Retrofit.Builder()
.baseUrl("https://api.themoviedb.org/3/genre/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
Observable<GenerosResponse> Genres = repo
.create(services.class)
.getAllGeneros("movie","list","da0d692f7f62a1dc687580f79dc1e6a0")
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread());
Observable<ResponseMovies> Movies = repo
.create(services.class)
.getAllMovies("28","movies","da0d692f7f62a1dc687580f79dc1e6a0",12)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread());
Observable<CollectionsMovies> combined = Observable.zip(Genres, Movies, new Func2<GenerosResponse, ResponseMovies, CollectionsMovies>() {
@Override
public CollectionsMovies call(GenerosResponse generosResponse, ResponseMovies responseMovies) {
return new CollectionsMovies(generosResponse, responseMovies);
}
});
combined.
subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(...);
Run Code Online (Sandbox Code Playgroud)
编辑
解决方案根据@Maxim Ostrovidov的回答:
private Observable<GenerosResponse> makeRequestToServiceA() {
return service.getAllGeneros("movie","list","da0d692f7f62a1dc687580f79dc1e6a0"); //some network call
} …
Run Code Online (Sandbox Code Playgroud) 我正在使用版本2.0.0的RxJava,似乎我无法访问AndroidSchedulers
.我无法通过RxJava访问mainthread
当我使用大量参数实例化类(或调用方法)时,我总是使用命名参数.但每次输入每个参数名称都很累人:
data class User(val id: String,
val name: String,
val age: Int)
val user = User(id = "1", name = "John", age = 99)
Run Code Online (Sandbox Code Playgroud)
IDEA可以预填这样的参数吗?
val user = User(
id = ,
name = ,
age =
)
Run Code Online (Sandbox Code Playgroud) 为什么contains
枚举类(以及Java)中没有方法?以及如何优雅地实现它?现在我正在使用这种丑陋的方法:
val contains: Boolean =
try {
MyEnum.valueOf("some string")
true
} catch (e: IllegalArgumentException) {
false
}
Run Code Online (Sandbox Code Playgroud) 在链obs1.flatmap(x -> obs2()).subscribe(sub)
是否obs2
会产生一个错误,它会导致立即调用onError
上sub
.这是记录在案的:
请注意,如果通过flatMap映射到源Observable中的项的任何单个Observable都通过调用onError中止,则flatMap生成的Observable将自行立即中止并调用onError.
但是有可能忽略obs2
错误并obs1
继续发射吗?
当我在没有在Android Oreo上指定的频道的情况下从Firebase控制台发送通知时,它必须使用"杂项"频道或者如果从Android清单提供默认频道.所以我在我的应用中创建并提供默认频道:
// Application onCreate
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val manager = getSystemService(Context.NOTIFICATION_SERVICE)
as NotificationManager
val channelId = getString(R.string.notification_channel_id)
if(manager.getNotificationChannel(channelId)==null) {
val channel = NotificationChannel(channelId,
getString(R.string.notification_channel_name),
NotificationManager.IMPORTANCE_DEFAULT)
channel.description =
getString(R.string.notification_channel_description)
manager.createNotificationChannel(channel)
}
}
// Manifest
<meta-data
android:name="com.google.firebase.messaging.default_notification_channel"
android:value="@string/notification_channel_id" />
Run Code Online (Sandbox Code Playgroud)
但它不起作用.通知始终使用"杂项"频道.我在这里遗漏了什么或者它是Firebase的错误吗?
android push-notification firebase firebase-cloud-messaging android-8.0-oreo