标签: rx-java2

RxAndroid - 使用 Zip 运算符处理错误

我试图找到一种方法来并行执行请求并在每个可观察对象完成时处理它们。尽管当所有 observables 都给出响应时一切都在工作,但我没有看到在一切都完成后处理所有错误的方法。

这是 zip 运算符的示例,它基本上并行执行 2 个请求:

Observable.zip(
                getObservable1()
                        .onErrorResumeNext { errorThrowable: Throwable ->
                            Observable.error(ErrorEntity(Type.ONE, errorThrowable))
                        }.subscribeOn(Schedulers.io()),
                getObservable2()
                        .onErrorResumeNext { errorThrowable: Throwable ->
                            Observable.error(ErrorEntity(Type.TWO, errorThrowable))
                        }.subscribeOn(Schedulers.io()),
                BiFunction { value1: String, value2: String ->
                    return@BiFunction value1 + value2
                })
                //execute requests should be on io() thread
                .subscribeOn(Schedulers.io())
                //there are other tasks inside subscriber that need io() thread
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(
                        { result ->
                            Snackbar.make(view, "Replace with your own action " + result, Snackbar.LENGTH_LONG)
                                    .setAction("Action", null).show()
                        },
                        { error ->
                            Log.d("TAG", "Error …
Run Code Online (Sandbox Code Playgroud)

error-handling kotlin rx-java rx-android rx-java2

1
推荐指数
1
解决办法
2246
查看次数

不兼容的类型,找到 List<capture<? 仅在 Java 8 中扩展模型>>

我目前正在审查 Android 应用程序的更改,这些更改将应用​​程序升级为使用 Java 8。

在审查期间,我注意到以下代码被加下划线作为错误:

List<MappableTask> tasks = Observable.fromIterable(taskMapHoldingPresenter.getMappableTasks())
        .filter(isMappableTask)
        .toList()
        .blockingGet();
Run Code Online (Sandbox Code Playgroud)

现在显示以下内容:

Incompatible Types.
Required: List<MappableTask>
Found: List<capture<? extends MappableTask>>
Run Code Online (Sandbox Code Playgroud)

getMappableTasks()方法在接口中定义如下:

List<? extends MappableTask> getMappableTasks();
Run Code Online (Sandbox Code Playgroud)

请注意,这MappableTask是由各种模型类实现的接口。

怎么是List<MappableTask> list = taskMapHoldingPresenter.getMappableTasks();无效的?

此代码按预期构建。如上所述,在升级应用程序以使用 Java 8 之前未显示此错误。为什么会出现此问题?

java android java-8 android-studio rx-java2

1
推荐指数
1
解决办法
989
查看次数

我如何在 android 中通过 RxJava2 实现这一点?

我正在尝试将图像上传到 Firebase 存储,我想通过 RxJava2 实现这一目标。这是我的代码..

public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {

    if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE) {
        val result = CropImage.getActivityResult(data)
        if (resultCode == Activity.RESULT_OK) {
            val resultUri = result.uri
            var actualImageFile = File(resultUri.path)
            dialogs = SpotsDialog(this, "upload")
            imageCompressor = Compressor(this)
            var image_bitmap = imageCompressor
                    ?.setMaxWidth(200)
                    ?.setMaxHeight(200)
                    ?.setQuality(75)
                    ?.compressToBitmap(actualImageFile)
            profile_image?.setImageBitmap(image_bitmap)
            dialogs?.show()
            try{
            FirebaseStorage.getInstance().reference.child("profile_images").child(FirebaseAuth.getInstance().currentUser?.uid + ".jpg").putFile(resultUri)
                    .addOnCompleteListener { task: Task<UploadTask.TaskSnapshot> ->
                        if (task.isSuccessful) {
                            showMessage("image uploaded")
                            val baos = ByteArrayOutputStream()
                            image_bitmap?.compress(Bitmap.CompressFormat.JPEG, 100, baos)
                            FirebaseStorage.getInstance().reference.child("profile_images").child("thumbs_images").child(FirebaseAuth.getInstance().currentUser?.uid + ".jpg").putBytes(baos.toByteArray())
                                    .addOnCompleteListener { …
Run Code Online (Sandbox Code Playgroud)

android firebase rx-java firebase-storage rx-java2

1
推荐指数
1
解决办法
554
查看次数

RxJava - 链式调用

我有两种方法。让它看到第一个的模型。

open class CommentModel {
    var postid: String? = null
    var ownerid: String? = null
    var created: Date? = null
    var message: String? = null

    constructor() {
    }

    constructor(postid: String?, ownerid: String?, message: String?, created: Date?) {
        this.ownerid = ownerid
        this.created = created
        this.postid = postid
        this.message = message
    }
}
Run Code Online (Sandbox Code Playgroud)

在这个模型中。我有ownerid。我需要开始一个新的调用来获取所有者的 UserModel。

所以:

   commentRepository.getPostCommentsById(postId)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(
                    { commentModel ->
                    // it = the owner of comment.
                        userRepository.getUserDetailsByUid(commentModel.ownerid!!)
                                .subscribeOn(Schedulers.io())
                                .observeOn(AndroidSchedulers.mainThread())
                                .subscribe(
                                        { userModel ->
                                            val comment = CommentWithOwnerModel(commentModel,usermodel)
                                            view.loadComment(comment) …
Run Code Online (Sandbox Code Playgroud)

android kotlin rx-java2

1
推荐指数
1
解决办法
745
查看次数

为什么不建议在一个管道中修改对象

我有一个关于 RxJava 的一般性问题。我在很多地方看到说完全不建议在一个管道步骤中修改对象。您应该创建一个新的并将其传递下去,或doOnNext()用于副作用。

例如

 Observable.fromIterable(users)
        .map(user -> {
            user.name =//do something with name);
            user.age = // do something with age);
            return user;
        }).subscribe(user -> {

        });
Run Code Online (Sandbox Code Playgroud)

如您所见,用户对象正在管道步骤中被修改。但是这段代码运行良好,没有任何问题。但是为什么它被认为是一种不好的做法呢?任何人都可以更好地解释为什么对象在整个流中应该是不可变的?

rx-java rx-java2

1
推荐指数
1
解决办法
71
查看次数

在 RxJava2 中将 Listener 转换为 Single

我正在使用 Play Services Auth api Phone,到目前为止我有以下内容

  fun startSmsListener() {
    val client = SmsRetriever.getClient(applicationContext /* context */);
    val task = client.startSmsRetriever();
    task.addOnSuccessListener(object : OnSuccessListener<Void> {
        override fun onSuccess(p0: Void?) {
             //do somethin
        }

    })
    task.addOnFailureListener(object : OnFailureListener {
        override fun onFailure(p0: Exception) {
            //Handle error
        }

    })
}
Run Code Online (Sandbox Code Playgroud)

现在我想把它放在一个 SmsManager 类中,并将它转换成一个 Single/Observable,这样我就可以在我的视图模型中以一种反应方式处理它。我怎样才能做到这一点?

到目前为止,我有这个:

var single = Single.create(SingleOnSubscribe<Void> { e ->
                val task = client.startSmsRetriever()
                task.addOnSuccessListener {
                    e.onSuccess(it)
                }
                task.addOnFailureListener {
                    e.onError(it)
                }
        })
Run Code Online (Sandbox Code Playgroud)

但我不确定这段代码是否正确,是否有遗漏的东西,比如在处理后删除监听器。

有什么帮助吗?

android reactive-programming kotlin rx-java rx-java2

1
推荐指数
1
解决办法
832
查看次数

onNext 没有在android、rxjava 中调用PublishSubject?

我正在使用 rxjava 2 并尝试使用 rxbus 传递值

接收总线代码

public class SeasonTabSelectorBus {
private static SeasonTabSelectorBus instance;

private PublishSubject<Object> subject = PublishSubject.create();

public static SeasonTabSelectorBus instanceOf() {
    if (instance == null) {
        instance = new SeasonTabSelectorBus();
    }
    return instance;
}

public void setTab(Object object) {
    try {
        subject.onNext(object);
        subject.onComplete();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public Observable<Object> getSelectedTab() {
    return subject;
}

}
Run Code Online (Sandbox Code Playgroud)

我将值设置为

 SeasonTabSelectorBus.instanceOf().setTab(20);
Run Code Online (Sandbox Code Playgroud)

这是我订阅的代码

SeasonTabSelectorBus.instanceOf().getSelectedTab().subscribe(new Observer<Object>(){
        @Override
        public void onSubscribe(Disposable d) {

        }

        @Override
        public void onNext(Object o) …
Run Code Online (Sandbox Code Playgroud)

android rx-android rx-java2 publishsubject

1
推荐指数
1
解决办法
1070
查看次数

安卓通用参数

大家好,我在传递参数时遇到了一些问题。我有 2 个 API 调用,如果设备没有互联网连接,我需要将调用传递回另一个类,因为每个 api 都有不同的 pojo,android 给我警告不匹配类型。这是我的代码

 override fun initRetrofitCarList(call: Observable<Response<MyCarModel>>) {
    compositeDisposable.add(call
            .map{
              it.body()
            }
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe({
                if (it.status == Constants.Result.SUCCESS) {
                    mPresenter.successGetVehicleList(it.vehicle, "api")
                } else {
                    mPresenter.failedGetVehicleList(it.message)
                }
            }, {
                mPresenter.onNoConnection(call) <- this here will give WARNING because of mismatch type
            }))
}

override fun initRetrofitBikeList(call: Observable<Response<MyBikeModel>>) {
    compositeDisposable.add(call
             .map{
              it.body()
            }
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe({
                if (it.status == Constants.Result.SUCCESS) {
                    mPresenter.successGetVehicleList(it.vehicle, "api")
                } else {
                    mPresenter.failedGetVehicleList(it.message)
                }
            }, {
                mPresenter.onNoConnection(call) <- this here will give …
Run Code Online (Sandbox Code Playgroud)

generics android kotlin rx-java2

1
推荐指数
1
解决办法
114
查看次数

内部类 ViewHolder 的构造函数只能与包含类的接收者一起调用

我想使用 RxJava2 在 RecyclerView 项目上设置一个监听器。项目是复选框。我想分别听每个项目。所以我得到一个错误内部类 ViewHolder 的构造函数只能用包含类的接收器调用

返回 TraceAdapter.ViewHolder(view)

class TraceAdapter(private var checkList: List<TraceViewModelRow> = listOf()) :
    RecyclerView.Adapter<TraceAdapter.ViewHolder>() {

private val publishSubject = PublishSubject.create<Event>()
val events: Observable<Event> = publishSubject

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TraceAdapter.ViewHolder {
    val view = LayoutInflater.from(parent.context).inflate(R.layout.item_trace_task, parent, false)
    return TraceAdapter.ViewHolder(view)
}

override fun getItemCount(): Int = checkList.size

override fun onBindViewHolder(holder: TraceAdapter.ViewHolder, position: Int) {

    holder.bindTraceList(checkList[position])

}

override fun onViewRecycled(holder: ViewHolder) {
    super.onViewRecycled(holder)
}

inner class ViewHolder(override val containerView: View) : RecyclerView.ViewHolder(containerView), LayoutContainer {

    fun bindTraceList(trace: …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-recyclerview rx-binding rx-java2

1
推荐指数
1
解决办法
1497
查看次数

使用 RXJava 监听 Room 数据库插入

我有一个带有 Room 数据库的简单 Android 应用程序,我正在尝试@Insert使用 RxJava对查询做出反应,但我无法正确链接调用。

这是我调用插入的视图模型方法:

fun insertTopic(): Single<Long> {
        val topic = Topic(null, topicText.value!!, difficulty.value!!, false)

        return Single.create<Long> { Observable.just(topicDao.insert(topic)) }
    }
Run Code Online (Sandbox Code Playgroud)

这是我的活动中触发保存操作的代码:

disposable.add(RxView.clicks(button_save)
            .flatMapSingle {
                viewModel.insertTopic()
                    .subscribeOn(Schedulers.io())
            }.observeOn(AndroidSchedulers.mainThread())
            .doOnError { Toast.makeText(this, "Error inserting topic", Toast.LENGTH_SHORT).show() }
            .subscribe { id ->
                // NOT INVOKED
                hideKeyboard()
                Toast.makeText(this, "Topic inserted. ID: $id", Toast.LENGTH_SHORT).show()
                this.finish
            })
Run Code Online (Sandbox Code Playgroud)

当我单击按钮时,实体被保存但没有调用任何订阅代码(没有显示吐司)。有人可以向我指出我做错了什么吗?我对 RX java 相当陌生。

android kotlin rx-java2 android-room

1
推荐指数
1
解决办法
1467
查看次数