我有一个简单的用例,其中:
Activity1创建一个fragment1
创建后的fragment1通知活动它是否已创建并更新其activity1视图.
获取通知更新fragment1视图后的activity1.
我正在使用rxandroid,sublibrary rxlifecycle组件和android,但我还在学习阶段,rx-lifecyclestackoverflow上甚至没有标记,所以我仍然在努力理解这个库的流程..
编辑
我不喜欢使用EventBus,就像每个人都大喊大叫做某事一样,所以Rxjava Observable方法会很有用
android android-fragments android-activity rx-android rx-binding
我想使用rxjava Observable处理Retrofit中的分页.我听从了另一个问题的建议.
我有超过100个页面需要被提取,但链在第20页的页面失败并停止对logserv的进一步订阅以及logcat中的以下日志
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)
Run Code Online (Sandbox Code Playgroud)
有人知道为什么会这样吗?
更新:我知道这是由于递归而发生的,但是有一种更优雅的方式来处理改装和rxjava的分页吗?
我们可以使用cache()运算符来避免多次执行长任务(http请求),并重用其结果:
Observable apiCall = createApiCallObservable().cache(); // notice the .cache()
---------------------------------------------
// the first time we need it
apiCall.andSomeOtherStuff()
.subscribe(subscriberA);
---------------------------------------------
//in the future when we need it again
apiCall.andSomeDifferentStuff()
.subscribe(subscriberB);
Run Code Online (Sandbox Code Playgroud)
第一次执行http请求,但第二次,因为我们使用了cache()运算符,请求将不会被执行,但我们将能够重用第一个结果.
第一个请求成功完成时,此工作正常.但是如果在第一次尝试中调用了onError,那么下次新订阅者订阅同一个observable时,将再次调用onError而不再尝试http请求.
我们要做的是,如果第一次调用onError,那么下次有人订阅同一个observable时,将从头开始尝试http请求.即,observable将仅缓存成功的api调用,即调用onCompleted的调用.
关于如何进行的任何想法?我们尝试使用retry()和cache()运算符没有太多运气.
我有一个绑定服务,负责下载文件,因此它知道下载状态/进度.UI(片段或活动)必须显示/更新服务的下载进度.
实际上我认为常用的方法是使用BroadcastReciever或CallBack来自Activity.但我听说过使用RxJava(ReactiveX编程)和中介类(以及Dagger将其注入服务和活动),如下所述.
所以我的问题是如何使用这些东西来处理RxJava?任何代码示例?有没有比使用意图更有效的方法?
资源: 从Service更新UI的有效方式比意图更新?[见第一个答案更新]
如何在收到onNext()后自动取消订阅?
现在我用这个代码:
rxObservable
.compose(bindToLifecycle()) // unsubscribe automatically in onPause() if method was called in onResume()
.subscribe(new Subscriber<Object>() {
...
@Override
public void onNext(Object o) {
unsubscribe();
}
});
Run Code Online (Sandbox Code Playgroud) 当我们使用retrofit2与Rx进行API休息调用时,使用Single或Observable的最佳方法是什么?
public interface ApiService{
Single<Data> getDataFromServer();
Observable<Data> getDataFromServer();
}
Run Code Online (Sandbox Code Playgroud) 我正在学习RxJava.为此,我在RxJava上关注了droidcon谈话视频.教练为他正在使用的项目提供了回购链接.当我尝试在我的机器上构建项目时,我克隆了repo.我收到这个错误
错误:无法删除旧的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"
jackOptions {
enabled true
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
lintOptions {
disable 'InvalidPackage' …Run Code Online (Sandbox Code Playgroud) 我有这样的任务:
Observable.just(getMessagesFromDb()).
subscribeOn(Schedulers.newThread()).
observeOn(AndroidSchedulers.mainThread()).
subscribe(incomingMessages -> {
//do something
});
Run Code Online (Sandbox Code Playgroud)
getMessagesFromDb方法在哪里同步获取消息,而不在内部进行多线程处理.根据subscribeOn方法的RxAndroid文档:
在指定的Scheduler上异步订阅Observvers到此Observable
还有我的问题 - 为什么数据库请求在主线程上执行?如何异步进行?
我在编辑文本搜索中使用rxandroid进行去抖操作
我用了
private void setUpText() {
_mSubscription = RxTextView.textChangeEvents(searchStation)//
.debounce(500, TimeUnit.MILLISECONDS)// default Scheduler is Computation
.observeOn(AndroidSchedulers.mainThread())//
.subscribe(getOps().getdata());
}
Run Code Online (Sandbox Code Playgroud)
和观察者一样
public Observer<TextViewTextChangeEvent> getdata()
{
return new Observer<TextViewTextChangeEvent>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
@Override
public void onNext(TextViewTextChangeEvent onTextChangeEvent) {
// stationsugession(onTextChangeEvent.text().toString());
//here i called link to get the data from the server
}
};
}
Run Code Online (Sandbox Code Playgroud)
我的问题是甚至在任何edittext更改发生之前调用链接.它没有调用textchange事件.我错过了什么我在这里做错了什么.我是rxandroid和rxjava的新手.
我用了
compile 'io.reactivex:rxandroid:1.1.0'
compile 'io.reactivex:rxjava:1.1.0'
compile 'com.jakewharton.rxbinding:rxbinding:0.2.0'
Run Code Online (Sandbox Code Playgroud)
编辑:
它现在可以工作,我在我的逻辑中得到一个空指针获取列表..当我使用onError方法并放置一个堆栈跟踪我发现问题.
如果你想跳过初始调用,那么我们应该将.skip(1)调用 到你的订阅对象.[感谢Daniel Lew ] …
我正在尝试获取给定的最新值,Observable并在调用后立即将其发出.以下面的代码为例:
return Observable.just(myObservable.last())
.flatMap(myObservable1 -> {
return myObservable1;
})
.map(o -> o.x) // Here I want to end up with a T object instead of Observable<T> object
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为通过这样做,flatMap将发射myObservable1,然后必须发射,以达到map.我不知道是否可以做这样的事情.有没有人知道如何实现这一目标?谢谢
rx-android ×10
rx-java ×9
android ×6
java ×3
gradle ×1
retrofit ×1
retrofit2 ×1
rx-binding ×1
ui-thread ×1