Articles of rx android

使用Retrofit rxjava concatWith时堆栈溢出

我想使用rxjava Observable处理Retrofit中的分页。 我听从了另一个问题的建议。 我有超过100个需要获取的页面,但链在第20页左右失败并停止使用logcat中的以下日志进一步订阅observable 04-04 04:12:11.766 2951-3012/com.example.app I/dalvikvm﹕ threadid=28: stack overflow on call to Ljava/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater;.compareAndSet:ZLJJ 04-04 04:12:11.766 2951-3012/com.example.app I/dalvikvm﹕ method requires 56+20+32=108 bytes, fp is 0x94b52350 (80 left) 04-04 04:12:11.766 2951-3012/com.example.app I/dalvikvm﹕ expanding stack end (0x94b52300 to 0x94b52000) 04-04 04:12:11.766 2951-3012/com.example.app I/dalvikvm﹕ Shrank stack (to 0x94b52300, curFrame is 0x94b548dc) 有人知道为什么会这样吗? 更新:我知道这是由于递归而发生的,但是有更优雅的方式来处理改装和rxjava的分页吗?

为什么在Android上使用Retrofit的RxJava doOnError()不起作用,但是Subscriber onError会起作用

谁能解释我为什么这样的代码: networApi.getList() .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .doOnError(throwable -> { throwable.getMessage(); }) .doOnNext(list -> { coursesView.populateRecyclerView(list); courseList = (List) courses; }).subscribe(); 如果没有互联网进入doOnError,但会进一步抛出,以便应用程序关闭,但代码如下: networkApi.getList() .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<List>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { e.getMessage(); } @Override public void onNext(List list) { coursesView.populateRecyclerView(list); courseList = (List) list; } }); 按照我的预期工作,这意味着当没有互联网连接时,它什么都不做 欢呼Wojtek

如何在RxJava中的Observable中处理map()中的exception

我想做这个: Observable.just(bitmap) .map(new Func1() { @Override public File call(Bitmap photoBitmap) { //File creation throws IOException, //I just want it to hit the onError() inside subscribe() File photoFile = new File(App.getAppContext().getCacheDir(), “userprofilepic_temp.jpg”); if(photoFile.isFile()) {//delete the file first if it exists otherwise the new file won’t be created photoFile.delete(); } photoFile.createNewFile(); //saves the file in the cache […]

无法删除旧的javaCompile操作,可能是类名已更改

我正在学习RxJava。 为此我在RxJava上关注了droidcon谈话video 。 教练为他正在使用的项目提供了回购链接 。 当我尝试在我的机器上构建项目时,我克隆了回购。 我收到这个错误 错误:无法删除旧的javaCompile操作,可能是类名已更改? 请提交错误报告,告知您正在使用的gradle版本。 这是gradle.build文件 buildscript { repositories { mavenCentral() } dependencies { classpath ‘me.tatarka:gradle-retrolambda:2.5.0’ } } repositories { mavenCentral() maven { url “https://github.com/alter-ego/advanced-android-logger/raw/develop/releases/” } } apply plugin: ‘retrolambda’ apply plugin: ‘com.android.application’ android { compileSdkVersion 23 buildToolsVersion “25.0.0” defaultConfig { applicationId “com.packtpub.apps.rxjava_essentials” minSdkVersion 16 targetSdkVersion 22 versionCode 1 versionName “1.0” […]

使用Rxjava Android从Activity更新片段

我有一个简单的用例,其中: Activity1创建一个fragment1 创建后的fragment1通知活动它是否已创建并更新其activity1视图。 获取通知更新fragment1视图后的activity1。 我正在使用rxandroid,sublibrary rxlifecycle组件和android,但我还在学习阶段,stackoverflow上甚rx-lifecycle没有rx-lifecycle标签,所以我仍然在努力理解这个库的流程.. 编辑 我不喜欢使用EventBus,就像每个人大喊大叫做某事一样,所以Rxjava Observable方法会很有用

测试RxBinding RxSearchView

背景 public Observable<List> search(SearchView searchView) { return RxSearchView.queryTextChanges(searchView) .filter(charSequence -> !TextUtils.isEmpty(charSequence)) .throttleLast(100, TimeUnit.MILLISECONDS) .debounce(200, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(AndroidSchedulers.mainThread()) .flatMap(this::performSearch) //Search the DB .onErrorResumeNext(this::doSomething); } 我试图使用AndroidJUnit4 runner和Mocktio测试上面的方法。 @Test public void testSearchCallsDataManager_WhenCalled() { String input = “abc”; when(mockSearchView.getQuery()).thenReturn(input); searchRequestManager.search(mockSearchView).subscribe(testSubscriber); //Using standard TestSubscriber testSubscriber.assertNoErrors(); testSubscriber.assertNotCompleted(); verify(mockDataManager).getFoos(input); } 问题 我尝试过使用mockSearchView和真正的SearchView 。 mockSearchView = mock(SearchView.class); searchView = new SearchView(InstrumentationRegistry.getContext(), null); searchView […]

RxJava + Retrofit – >用于API调用的BaseObservable,用于集中响应处理

我是RxJava的新手所以请原谅我,如果这听起来太新手了:-)。 截至目前,我有一个抽象的CallbackClass,它实现了Retofit Callback。 在那里我捕获了Callback的“onResponse”和“onError”方法,并在最终转发到自定义实现的方法之前处理各种错误types。 我还使用此集中式类来进行请求/响应应用程序日志记录和其他内容。 例如:对于来自我的服务器的特定错误代码,我在响应正文中收到一个新的Auth令牌,刷新令牌,然后clone.enqueue调用。 当然,我的服务器的响应还有其他一些全局行为。 目前的解决方案(没有Rx): public abstract void onResponse(Call call, Response response, boolean isSuccess); public abstract void onFailure(Call call, Response response, Throwable t, boolean isTimeout); @Override public void onResponse(Call call, Response response) { if (_isCanceled) return; if (response != null && !response.isSuccessful()) { if (response.code() == “SomeCode” && retryCount < RETRY_LIMIT) { […]

RxJava单个后台线程调度程序

我对RxJava很新,所以这可能是一个愚蠢的问题。 我将描述我的情景。 我在UI线程上运行了一些代码,这些代码将更新一些图像,但这些图像不是很重要,它们在生成它们时消耗了一些资源,因此我想在单个线程上生成它们(当然不是UI线程)逐个生成它们。 我猜蹦床调度程序是我想要的,但我的问题是,如果我使用它然后它在UI线程上工作,我希望它在另一个线程上执行。 显然我可以编写自己的线程,我可以在其中对项目进行排队,然后逐个处理这些,但我想RxJava可能会有一个简单的解决方案吗? 我当前的代码如下所示: Observable getImage = Observable.create(new Observable.OnSubscribe() { @Override public void call(Subscriber subscriber) { Log.w(TAG,”On ui thread? “+ UIUtils.isRunningOnUIThread()); subscriber.onNext(doComplexTaskToGetImage()); subscriber.onCompleted(); } }); getImage.subscribeOn(Schedulers.trampoline()).subscribe(new Action1() { @Override public void call(Bitmap bitmap) { codeToSetTheBitmap(bitmap); } }); 我的日志上写着“On ui thread?” 总是如此。 那么我如何使代码和所有后续尝试执行相同的操作在一个线程(而不是ui线程)上按顺序运行而无需编写一堆代码来排队工作? 编辑: 我相信现在可以使用Schedulers.single()来完成,或者如果你想要自己的,你可以使用new SingleScheduler() 。 我还在测试,但是当我发布这个post时,我认为它确实符合我的要求。

如何解决APK META-INF / rxjava.properties中复制的重复文件

我在我的android应用程序上使用rxjava和rxvolley。 当我尝试运行它时,我收到此错误 Execution failed for task ‘:testapp:transformResourcesWithMergeJavaResForDebug’. > com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK META-INF/rxjava.properties File1: C:\Users\Daniel\.gradle\caches\modules-2\files-2.1\io.reactivex\rxjava\1.1.0\748f0546d5c3c27f1aef07270ffea0c45f0c42a4\rxjava-1.1.0.jar File2: C:\Users\Daniel\.gradle\caches\modules-2\files-2.1\io.reactivex.rxjava2\rxjava\2.0.3\d2f725668bd22e21170381b23f8fbdf72c69d886\rxjava-2.0.3.jar 我有这样的exclude.gradle文件 android { packagingOptions { exclude ‘META-INF/DEPENDENCIES.txt’ exclude ‘META-INF/NOTICE’ exclude ‘META-INF/NOTICE.txt’ exclude ‘META-INF/LICENSE’ exclude ‘META-INF/LICENSE.txt’ exclude ‘META-INF/rxjava.properties’ exclude ‘META-INF/rxjava.PROPERTIES’ exclude ‘META-INF/RXJAVA.properties’ exclude ‘META-INF/RXJAVA.PROPERTIES’ exclude ‘META-INF/rxjava’ exclude ‘META-INF/RXJAVA’ } lintOptions { abortOnError false } } 我该如何解决这个问题?

为什么要考虑在RxJava中使用AndroidObservables

据我所知, AndroidObservable有助于确保: 订阅者始终在主线程上观察 当分离/活动被分离/停止时,观察立即停止,并且不更新与框架相关的组件(如ui textviews等)。 但是,为了确保上下文被释放(防止泄漏),我看到的大多数示例通常都说你必须做.unsubscribe onDestroyView / onDestroy,这实质上会停止订阅,并阻止订阅者接收这些更新。 所以我的问题是: 如果我通过.observeOn(AndroidSchedulers.mainThread()手动指示订阅应该在主线程上发生,那么使用AndroidObservables还有其他优势吗? 以下两种方法有什么不同吗? _subscription1 = AndroidObservable.bindFragment(MyFragment.this, myCustomAwesomeObservable()) // .subscribeOn(Schedulers.io()) // .subscribe(…); _subscription2 = myCustomAwesomeObservable() .subscribeOn(Schedulers.io()) // .observeOn(AndroidSchedulers.mainThread()) // .subscribe(…); @Override public void onDestroyView() { _subscription1.unsubscribe(); _subscription2.unsubscribe(); super.onDestroyView(); }