标签: rx-java2

RxJava UndeliverableException how to handle onSuccess consumer exception?

The exception ended up not handled and was reported as a non-fatal in Crashlytics, hence fell off our radar User saw a blank screen which is not desirable A crash would have been better, for fail-fast is preferred

Ideally, I'd like to the onError consumer to be trigger, that's where I handle the error e.g. shows error UI for every stream

However,

fun main() {
    Single.just(listOf("efaewf"))
            .subscribe({
                println("result is ${it[1]}")
            }, {
                println("handling exception")
                it.printStackTrace()
            })
}
Run Code Online (Sandbox Code Playgroud)

shows that onError …

kotlin rx-java rx-java2

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

Rxjava2/RxAndroid2,dispose(寻找rx1 unsubsribe的等价物)

这是我第一次在反应范式世界中开发,我开始使用rxjava2/rxandroid2,基于我观看过的视频和我读过的文章,从2开始看起来更好,因为有很多变化,图书馆的大规模存在差异,但现在我在寻找像这样的东西时遇到了一些麻烦

 unsubscribe()
Run Code Online (Sandbox Code Playgroud)

以前的rxjava/rxandroid库的方法

我的目标很简单

  • 执行API调用(网络操作)
  • 听取并观察可观察物将发出的东西(快乐的道路)
  • 当应用程序进入PAUSE状态时,请不要听或做出反应
  • 或者,一旦android进入暂停生命周期,就取消订阅observable

,基于周围的资源

 dispose()
Run Code Online (Sandbox Code Playgroud)

rx2的方法,我对此的理解是它处理任何当前资源(在我的情况下,基于我理解的,调用它将使可观察的自身分离给任何观察者).

但这似乎不是我所期待的,请看一下ff代码:

public class MainActivity extends AppCompatActivity {

    final Disposable disposable = new Disposable() {

        @Override
        public void dispose() {
            Log.e("Disposed", "_ dispose called.");
        }

        @Override
        public boolean isDisposed() {
            return true;
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Observer<Object> observer = new Observer<Object>() {

            @Override
            public void onSubscribe(Disposable d) {
                Log.e("OnSubscribe", "On Subscribed Called");
            }

            @Override
            public void onNext(Object value) {
                Log.e("onNext", "Actual Value (On Next …
Run Code Online (Sandbox Code Playgroud)

android dispose unsubscribe rx-android rx-java2

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

Android无法解析rxjava中的订阅方法

我打算在Android Studio中使用rxjava进行改造。实际上我遵循了 https://code.tutsplus.com/tutorials/getting-started-with-retrofit-2--cms-27792教程这就是我所做的一切:

compile 'com.android.support:appcompat-v7:25.1.0'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    testCompile 'junit:junit:4.12'
    compile 'com.squareup.retrofit2:retrofit:2.2.0'
    compile 'com.google.code.gson:gson:2.8.0'
    compile 'com.squareup.retrofit2:converter-gson:2.2.0'
    compile 'com.android.support:recyclerview-v7:25.1.0'
    compile 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'
    compile 'io.reactivex.rxjava2:rxjava:2.0.9'
    compile 'io.reactivex:rxandroid:1.2.1'
    compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
    compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
Run Code Online (Sandbox Code Playgroud)

我创建了Retrofit客户端和Interface订阅方法。说不能解决

mService.getAnswer().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
             .subscribe(new Subscriber<SOAnswersResponse>() {
                            @Override
                            public void onCompleted() {

                            }

                            @Override
                            public void onError(Throwable e) {

                            }

                            @Override
                            public void onNext(SOAnswersResponse soAnswersResponse) {

                            }


       }
         );
Run Code Online (Sandbox Code Playgroud)

我在主要活动中导入了此内容:

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;

import android.widget.Toast;

import com.example.android.stackoverflow.Data.Model.Item;

import com.example.android.stackoverflow.Data.Model.SOAnswersResponse;
import com.example.android.stackoverflow.Data.remote.ApiUtils;
import com.example.android.stackoverflow.Data.remote.SOService;


import java.util.ArrayList;


import io.reactivex.schedulers.Schedulers; …
Run Code Online (Sandbox Code Playgroud)

android rx-android retrofit2 rx-java2

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

找不到封闭方法'void lambda $ getTestFlowable $ 0(io.reactivex.FlowableEmitter)'

我在我的项目中使用RxJava2和Retrolambda,并且有一段时间我觉得非常好,将回调包装成flowables,但有一天我遇到了这个错误,如果我尝试在这个非常简化的代码片段上运行proguard:

    private Flowable<Object> getTestFlowable() {
        return Flowable.create(emitter -> new Thread(new Runnable() {
            @Override
            public void run() {
                emitter.onNext("one");
                emitter.onComplete();
            }
        }).run(), BackpressureStrategy.BUFFER);
    }
Run Code Online (Sandbox Code Playgroud)

然后我会得到这个警告,这使我的构建失败:警告:com.yandex.testfield.MainActivity $ 1:在程序类com.yandex中找不到封闭方法'void lambda $ getTestFlowable $ 0(io.reactivex.FlowableEmitter)'. testfield.MainActivity

现在,我看到两个临时解决方案来解决这个问题:

  1. 不要使用lambda而是使用匿名类

    private Flowable<Object> getTestFlowable() {
        return Flowable.create(new FlowableOnSubscribe<Object>() {
            @Override
            public void subscribe(FlowableEmitter<Object> emitter) throws Exception {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        emitter.onNext("one");
                        emitter.onComplete();
                    }
                }).run();
             }
        }, BackpressureStrategy.BUFFER);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 禁用类上的proguard,其中包含上面列出的方法

但我仍然想知道为什么会这样?这是RxJava2\Retrolambda\Proguard中的错误吗?

java android proguard retrolambda rx-java2

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

我可以跟踪RxJava订阅服务器中的事件消耗吗?

我想跟踪订阅者何时开始使用事件以及何时完成.是否有适用于所有Observables/Subscribers的通用方法?

rx-java rx-java2

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

片段替换后,使用RxJava2 + RxBinding的RecyclerView项目单击不起作用

我在Fragment中有一个RecyclerView,如该SO回答中所述,使用RxJava2处理了项目单击,在非片段中工作正常。

private PublishSubject<Place> itemViewClickSubject = PublishSubject.create();

@Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.search_result_view, parent, false);

        ViewHolder viewHolder = new ViewHolder(view);

        // convert click events into reactive stream
        RxView.clicks(view)
                .takeUntil(RxView.detaches(parent))
                // viewHolder.getPlace() is null until it get bound
                .map(__ -> viewHolder.getPlace())
                .subscribe(itemViewClickSubject);

        return viewHolder;
    }
Run Code Online (Sandbox Code Playgroud)

片段中的RecyclerView只能正常运行一次。在项目单击片段上替换为另一个片段。后按后,出现RecyclerView片段,但单击不再起作用。

如果我删除该.takeUntil(RxView.detaches(parent))行,它将起作用。我认为有必要在RecyclerView未显示(分离)时破坏RxView单击的牢固绑定。我该如何解决这个问题?我正在寻找使用附加/分离事件之一解决问题的方法,任何建议都很棒!谢谢。

android android-fragments android-recyclerview rx-binding rx-java2

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

RxJava在主线程中运行平面图的一部分

嗨,我正在尝试实现将两个请求链接在一起的Single Observable。

在我发出的两个请求之间,我通知回调以使用请求1的响应更新UI,然后在Schedulaers.io线程中启动下一个请求。

我遇到的问题是它也尝试从schedulars.io线程更新UI,导致ui线程中没有更新。

我在Android的RunOnUiThread代码块上冷套了calback,但想知道是否有更优雅的方法吗?

我检查了couroutines,似乎只处理将代码块放在单独的线程中。

这是我当前的代码

override fun getHomeScreenInformation() {
    delegator.requestOne()
            .flatMap { responseOne->
                homeScreenCallBack.onResponseOneRecieved(responseOne)
                delegator.requestTwo()
            }
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.io())
            .subscribe(
                    {responseTwo-> homeScreenCallBack.onResponseTwoRecieved(responseTwo)},
                    {error -> homeScreenCallBack.onError()}
            )
}
Run Code Online (Sandbox Code Playgroud)

multithreading android kotlin rx-java2

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

如何使用RxJava2过滤Arraylist

用于过滤列表RxJava2.不知何故让它发挥作用.但问题是,它在回调中仅返回List中的一个项目Consumer(大小始终为1)

这是代码:

 Observable.fromIterable(arraylist)
                   .filter(new Predicate<BasicListModel>() {
                       @Override
                       public boolean test(BasicListModel model) throws Exception {
                           return true; //returning true for all items in filter
                       }
                   })
                   .toList()
                   .observeOn(Schedulers.computation())
                   .subscribe(new Consumer<List<BasicListModel>>() {
                       @Override
                       public void accept(List<BasicListModel> models) throws Exception {

                               Log.i("TAG"," size:"+models.size());

                       }
                   });
Run Code Online (Sandbox Code Playgroud)

我是RxJAva1或RxJava2的新手.

java android arraylist rx-java2

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

RxJava Single到Completable to Single-如何将第一个Single的结果传递给第二个Single

在以下方法中,如何将第一个Single的结果传递给第二个Single?

如现在所写,返回时somethingId为空。如果我将返回值更改为Single.just(somethingId)空字符串以外的其他值,它将返回该值。

有趣的是,如果我在方法中断点,它会在第5行和第6行之前停在第7行。

andThen在线7 的文档说:

返回一个Single,它将订阅此Completable,完成后将订阅{@code next} SingleSource。

为什么它似乎按照该顺序执行和/或有更好的方法来执行此操作?

1 override fun downloadSomething(): Single<String> {
2    var somethingId = ""
3    return remoteDataSource.downloadSomething() // this is a Single
4        .flatMapCompletable { something ->
5            somethingId = something.id
6            saveSomething(something) // this is a Completable
7        }.andThen(Single.just(somethingId))
8 }
Run Code Online (Sandbox Code Playgroud)

在这一点上,我唯一想做的就是为第saveSomething()6行的方法返回Single (有效)。但是,我只是更改了该方法的签名,以便可以在感觉不正确的特定方法中使用它。当然,有一种方法可以不执行此操作?

android rx-java2

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

RxJava2,如何结合多个可观察的结果?

我正在开发Android应用程序.我有一个关于RxJava2的问题.这是一个例子:

我有一个用户ID列表.(1,2,3,4,5 ......)

val userIds = listOf(1, 2, 3, 4, 5)
Run Code Online (Sandbox Code Playgroud)

我想列出用户数据.要获取用户数据,我应该调用"REST API".(改造)在这种情况下,我应该要求多个.

GET/users/1

GET/users/2

GET/users/3

GET/users/4

GET/users/5

...

fun getUsers(userIds: List<String>, callback: UsersLoadedCallback) {
    var userList = List<User>()

    val userObservables = mutableListOf<Observable<User>>()
    userIds.forEach {
        userObservables.add(UserService.getUser(it))
    }

    Observable.merge(userObservables)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe {
                userList.add(it)
            }
}
Run Code Online (Sandbox Code Playgroud)

我知道这是错的.但我不知道如何解决这个问题."加入","合并","拉链"?我应该怎么做?

android kotlin rx-java retrofit rx-java2

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