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 …
这是我第一次在反应范式世界中开发,我开始使用rxjava2/rxandroid2,基于我观看过的视频和我读过的文章,从2开始看起来更好,因为有很多变化,图书馆的大规模存在差异,但现在我在寻找像这样的东西时遇到了一些麻烦
unsubscribe()
Run Code Online (Sandbox Code Playgroud)
以前的rxjava/rxandroid库的方法
我的目标很简单
,基于周围的资源
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 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) 我在我的项目中使用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
现在,我看到两个临时解决方案来解决这个问题:
不要使用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)但我仍然想知道为什么会这样?这是RxJava2\Retrolambda\Proguard中的错误吗?
我想跟踪订阅者何时开始使用事件以及何时完成.是否有适用于所有Observables/Subscribers的通用方法?
我在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
嗨,我正在尝试实现将两个请求链接在一起的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) 用于过滤列表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的新手.
在以下方法中,如何将第一个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应用程序.我有一个关于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)
我知道这是错的.但我不知道如何解决这个问题."加入","合并","拉链"?我应该怎么做?
rx-java2 ×10
android ×8
kotlin ×3
rx-java ×3
java ×2
rx-android ×2
arraylist ×1
dispose ×1
proguard ×1
retrofit ×1
retrofit2 ×1
retrolambda ×1
rx-binding ×1
unsubscribe ×1