Articles of rx android

使用RxJava从存储库中获得网络意识

我很难find一个合适的解决方案来使view / viewmodel知道网络状态,特别是使用RxJava。 我试图关注谷歌的NetworkBoundResource和Iammert的networkBoundResouce (也试过GithubBrowserSample,但我真的不明白代码或它应该如何封装。 我正在寻找如何使用RxJava2实现NetworkBoundResource,使数据自动刷新数据库。 我将展示我目前拥有的东西: 与arch.lifecycle.ViewModel的片段 public class LoginViewModel extends ViewModel { static final int SCREEN_JUST_BUTTONS = 0; static final int SCREEN_LOGIN_INPUT = 1; static final int SCREEN_PASS_INPUT = 2; // using a PublishSubject because we are not interested in the last object that was emitted // before subscribing. Like this we avoid […]

CursorLoader的onLoadFinished回调中的RxJava2

要从数据库中获取数据,我在应用程序中使用CursorLoader 。 一旦onLoadFinished()回调方法调用app的逻辑,就将Cursor对象转换为业务模型要求中的对象List 。 如果有大量数据,那么转换(繁重操作)需要一些时间。 这会降低UI线程的速度。 我尝试使用传递Cursor对象的RxJava2在非UI Thread开始转换,但是得到了Exception : Caused by: android.database.StaleDataException: Attempting to access a closed CursorWindow.Most probable cause: cursor is deactivated prior to calling this method. 这是Fragment代码的一部分: @Override public Loader onCreateLoader(int id, Bundle args) { QueryBuilder builder; switch (id) { case Constants.FIELDS_QUERY_TOKEN: builder = QueryBuilderFacade.getFieldsQB(activity); return new QueryCursorLoader(activity, builder); default: return null; } […]

如何使用RxJava处理回收站视图的项目点击

我有兴趣了解回应物品点击回收者视图的最佳方法是什么。 通常我会向ViewHolder添加一个onclick()侦听器,并通过接口将结果传回活动/片段。 我想在onBindViewHolder中添加一个Observable,但我不想为每个项目绑定创建一个新的Observable。

RxJava flatMapIterable with Single

我正在尝试整理我的代码,而Single对我来说是一个不错的选择,因为我正在做一些只能发出一个结果的东西。 我遇到了一个问题,因为我之前使用flatMapIterable来获取我的响应(列表)并对每个项目执行某些操作。 我没有看到我如何用Single实现这个目标。 getListOfItems() .flatMapIterable(items -> items) .flatMap(item -> doSomethingWithItem()) .toList() 如果getListOfItems返回一个Observable但是如果我尝试让它返回一个Single ,那么这个工作正常,那么我不能做flatMapIterable并且看不到替代,任何想法?

如何实现用户输入的定期处理?

我当前的Android应用程序允许用户远程搜索内容。 例如,向用户呈现EditText ,该EditText接受其搜索字符串并触发远程API调用,该调用返回与输入的文本匹配的结果。 更糟糕的情况是,每次调用TextWatcher ,我只需添加一个TextWatcher并触发API调用。 这可以通过在进行第一次API调用之前强制用户输入至少N个字符来搜索来改进。 “完美”解决方案具有以下特点: – 一旦用户开始输入搜索字符串 定期(每M毫秒)消耗输入的整个字符串。 每当周期到期并且当前用户输入与先前的用户输入不同时触发API调用。 [是否有可能与输入的文本长度相关的动态超时? 例如,虽然文本“短”,但API响应大小会很大,并且需要更长时间才能返回和解析; 随着搜索文本变得越来越长,API响应大小将随着“飞行”和解析时间而减少 当用户重新键入EditText字段时,重新启动Periodic消耗文本。 每当用户按下ENTER键触发“最终”API调用,并停止监视用户输入到EditText字段。 设置用户在触发API调用之前必须输入的文本的最小长度,但将此最小长度与覆盖的超时值组合,以便当用户希望搜索“短”文本字符串时。 我确信RxJava和/或RxBindings可以支持上述要求,但到目前为止我还没有实现一个可行的解决方案。 我的尝试包括 private PublishSubject publishSubject; publishSubject = PublishSubject.create(); publishSubject.filter(text -> text.length() > 2) .debounce(300, TimeUnit.MILLISECONDS) .toFlowable(BackpressureStrategy.LATEST) .subscribe(new Consumer() { @Override public void accept(final String s) throws Exception { Log.d(TAG, “accept() called with: s = [” + s + […]

RxJava- RxAndroid在动态EditText上进行表单validation

我的表单可以包含可变数量的EditText ,需要在表单提交之前进行validation。 我可以执行validation检查,如果EditText的数量是固定的,如下所示 – Observable emailObservable = RxTextView.textChanges(editEmail).skip(1); Observable passwordObservable = RxTextView.textChanges(editPassword).skip(1); mFormValidationSubscription = Observable.combineLatest(emailObservable, passwordObservable, (newEmail, newPassword) -> { boolean emailValid = !TextUtils.isEmpty(newEmail) && android.util.Patterns.EMAIL_ADDRESS.matcher(newEmail).matches(); if(!emailValid) { emailInputLayout.setError(getString(R.string.error_invalid_email)); emailInputLayout.setErrorEnabled(true); }else { emailInputLayout.setError(null); emailInputLayout.setErrorEnabled(false); } boolean passValid = !TextUtils.isEmpty(newPassword) && newPassword.length() > 4; if (!passValid) { passwordInputLayout.setError(getString(R.string.error_invalid_password)); passwordInputLayout.setErrorEnabled(true); } else { passwordInputLayout.setError(null); passwordInputLayout.setErrorEnabled(true); } return […]

Rx 2 Android对于api调用有什么更好的Single或Observable?

当我们使用retrofit2与Rx进行APIrest调用时,使用的最佳方法是单一还是可观察? public interface ApiService{ Single getDataFromServer(); Observable getDataFromServer(); }

如何使用RxJava / RxAndroid从Android服务更新UI

我有一个绑定服务,负责下载文件,因此它知道下载状态/进度。 UI(片段或活动)必须显示/更新服务的下载进度。 实际上我认为常用的方法是使用BroadcastReciever或来自Activity的CallBack 。 但我听说过有关使用RxJava(ReactiveX Programming)和mediator类(以及Dagger将其注入服务和活动)的地方,如下所述。 所以我的问题是如何使用这些东西来处理RxJava? 任何代码示例? 有没有比使用意图更有效的方法? 资源: 从Service更新UI的方式比意图更有效? [见第一个答案更新]

RxJava:如何使用zip操作符处理错误?

我正在使用RxJava和RxAndroid与Retrofit2。 Observable responseOneObservable = getRetrofitClient().getDataOne() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); Observable responseTwoObservable = getRetrofitClient().getDataTwo() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); 在上面两个Observer上使用如下的zip操作符。 Observable<ArrayList> testDataObservable = Observable.zip(responseOneObservable, responseTwoObservable, new Func2<ResponseOne, ResponseTwo, ArrayList>() { @Override public ArrayList call(ResponseOne responseOne, ResponseTwo responseTwo) { ArrayList testDataList = new ArrayList(); // Add test data from response responseOne & responseTwo return testDataList; } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<ArrayList>() { […]

在Android中使用RxJava排队任务

我正在开发具有后台数据同步function的Android应用程序。 我目前正在使用RxJava定期在服务器上发布一些数据。 除此之外,我想为用户提供一个“强制同步”按钮,它会立即触发同步。 我知道如何使用Observable.interval()以固定的时间间隔推送数据,我知道如何使用Observalbe.just()来推送那个被强制的数据,但我想将它们排队,如果是这样的话当前一个仍在运行时触发一个。 所以让我们举个例子,1min是自动同步的间隔,让我们说同步持续40秒(我夸张这里只是为了更容易点)。 现在,如果有任何机会,用户在自动仍然运行时按下“强制”按钮(反之亦然 – 当强制一个仍在运行时自动触发),我想将第二个同步请求排队第一个完成。 我画了这张图片,可能会有更多的视角: 如您所见,自动被触发(通过一些Observable.interval() ),并且在同步过程中,用户按下“强制”按钮。 现在我们要等待第一个请求完成,然后再次启动强制请求。 有一次,当强制请求正在运行时,再次触发了新的自动请求,只是将其添加到队列中。 从队列中完成最后一个后,一切都停止,然后稍后再次安排自动。 希望有人能指出我纠正操作员如何做到这一点。 我已经尝试使用Observable.combineLatest() ,但是队列列表在开始时被调度,当我将新的同步添加到队列时,它在前一个操作完成时没有继续。 Darko,非常感谢任何帮助