gpt4 book ai didi

android - 函数不在后台线程上执行

转载 作者:太空狗 更新时间:2023-10-29 16:13:33 25 4
gpt4 key购买 nike

我正在尝试将 RX 应用于 Android。我希望在单击按钮时从 Web 下载某些内容并显示它。

我的问题是 HttpClient.connect() 在主线程上执行 而不是后台线程。对 HttpClient.connect() 的调用作为传递给 Observable.map() 的函数执行

Observable<Integer> dayDeltas =  Obs.obsToSequence(Obs.Observable(textView)); //transforms click events to observable
Observable<String> dates = dayDeltas.map(...).map(...)
dates.map(Obs.dateToWebPage()) // calls http.connect()
.map(Obs.parseEvents())
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.newThread())
.subscribe(updateTextView(textView));

public static Observable<Object> Observable(final TextView text) {
return Observable.create(new Observable.OnSubscribe<Object>() {
@Override
public void call(final Subscriber<? super Object> subscriber) {
final Object event = new Object();
text.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("click", "click");
subscriber.onNext(event);
}
});
}
});

现在我天真的解释是,因为我有 .subscribeOn(Schedulers.newThread()) 可观察对象上的每个函数/运算符都应该在一个新线程中执行,包括 .map(f)。显然这不是正在发生的事情,那么这条链的哪一部分在新线程上执行?

最佳答案

subscribeOn 用于触发订阅副作用。在您的设置中,它将注册回调以捕获新线程上的按钮按下,但是当按下发生时,onNext 发射由主线程触发。然后,包括网络连接在内的链在主线程上执行。

您必须在连接方法之前放置一个新的 observeOn(Schedulers.io()) 以确保按钮按下事件的接收发生在主线程之外。

编辑:

//transforms click events to observable
Observable<Integer> dayDeltas = Obs.obsToSequence(Obs.Observable(textView));

Observable<String> dates = dayDeltas.map(...).map(...)
dates
.observeOn(Schedulers.io()) // <------------------------------------------ add
.map(Obs.dateToWebPage()) // calls http.connect()
.map(Obs.parseEvents())
.observeOn(AndroidSchedulers.mainThread())
//.subscribeOn(Schedulers.newThread()) // <------------------------------- remove
.subscribe(updateTextView(textView));

关于android - 函数不在后台线程上执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36523049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com