[英]FIRST Why do I get this errorwith Rxjava2 and Retrofit? SECOND Should I be using WeakReference or Activity directly?
请注意,我对我的上下文使用了 WeakReference,这是一个 Activity。 但是,我应该直接使用 Context 吗? (没有弱引用)? 我应该如何将它作为参数传递给我的 createSchoolSearchObservable 方法?
public void startSearchFeature(Context context) {
WeakReference<SchoolSearchActivity> activityReference = new WeakReference<>((SchoolSearchActivity) context);
Disposable disposable = createSchoolSearchObservable(context)
.debounce(400, TimeUnit.MILLISECONDS)
.filter(query -> query.length() >= 2)
.distinctUntilChanged()
.switchMap(new Function<String, ObservableSource<SchoolResponse>>() {
@Override
public ObservableSource<SchoolResponse> apply(String query) throws Exception {
return loadSchools(query);
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(schoolSearchResponse -> {
List<Node<SchoolSearchResult>> results = schoolSearchResponse.getSchoolSearchResults();
if (results == null) {
Log.e(TAG, "Results are null");
}
if (activityReference.get() != null) {
ListAdapter adapter = activityReference.get().binding.schoolAutocompleteSearch.getAdapter();
if (adapter instanceof SchoolSearchAdapter) {
((SchoolSearchAdapter) adapter).setSchoolSearchResults(results);
} else {
activityReference.get()
.binding.schoolAutocompleteSearch
.setAdapter(SchoolSearchAdapter.newInstance(activityReference.get(), R.layout.school_search_item, results));
}
}
}, throwable -> {
Log.e(TAG, throwable.getMessage(), throwable);
});
addDisposable(disposable);
}
// https://github.com/amitshekhariitbhu/RxJava2-Android-Samples/blob/master/app/src/main/java/com/rxjava2/android/samples/ui/search/SearchActivity.java
private Observable<String> createSchoolSearchObservable(Context context) {
WeakReference<SchoolSearchActivity> activityReference = new WeakReference<>((SchoolSearchActivity) context);
final PublishSubject<String> subject = PublishSubject.create();
final TextWatcher watcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence query, int i, int i1, int i2) {
Log.d(TAG, query.toString());
subject.onNext(query.toString());
}
@Override
public void afterTextChanged(Editable editable) {
}
};
final AdapterView.OnItemClickListener listener = (AdapterView<?> parent, View view, int position, long id) -> {
if (parent.getAdapter() == null) {
subject.onComplete();
return;
}
SchoolSearchResult schoolSearchResult = (SchoolSearchResult) parent.getAdapter().getItem(position);
SharedPreferences preferences = activityReference.get().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putString(activityReference.get().getString(R.string.school_id), schoolSearchResult.getSchoolId());
editor.putString(activityReference.get().getString(R.string.school_name), schoolSearchResult.getSchoolName());
editor.apply();
subject.onComplete();
};
activityReference.get().binding.schoolAutocompleteSearch.addTextChangedListener(watcher);
activityReference.get().binding.schoolAutocompleteSearch.setOnItemClickListener(listener);
return subject;
}
// goes into different viewmodel
private Observable<SchoolResponse> loadSchools(CharSequence query) {
// load observable from retrofit call
}
null java.io.InterruptedIOException at okhttp3.internal.http2.Http2Stream.waitForIo(Http2Stream.java:579) at okhttp3.internal.http2.Http2Stream.takeResponseHeaders(Http2Stream.java:143) at okhttp3.internal.http2.Http2Codec.readResponseHeaders (Http2Codec.java:120) at okhttp3.internal.http.CallServerInterceptor.intercept(CallServerInterceptor.java:67) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92) at okhttp3.internal.connection.ConnectInterceptor。拦截(ConnectInterceptor.java:45) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67) at okhttp3.internal.cache.CacheInterceptor .intercept(CacheInterceptor.java:93) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67) at okhttp3.internal.http。 BridgeInterceptor.intercept(BridgeIn terceptor.java:93) 在 okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92) 在 okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:120) 在 okhttp3.internal.http. (RealInterceptorChain.java:92) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67) at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:179) at okhttp3.RealCall.execute(RealCall.java:63)在retrofit2.OkHttpCall.execute(OkHttpCall.java:174) 在retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(CallExecuteObservable.java:41) 在io.reactivex.Observable.subscribe(Observable.java:10910) 在retrofit2.adapter rxjava2.BodyObservable.subscribeActual(BodyObservable.java:34) 在 io.reactivex.Observable.subscribe(Observable.java:10910) 在 io.reactivex.internal.operators.observable.ObservableSwitchMap$SwitchMapObserver.onMapNext(Observable126SwitchMapNext)在 io.reactivex.internal.operators。 observable.ObservableDistinctUntilChanged$DistinctUntilChangedObserver.onNext(ObservableDistinctUntilChanged.java:85) 在 io.reactivex.internal.operators.observable.ObservableFilter$FilterObserver.onNext(ObservableFilter.java:52) 在 io.reactivex.internal.operators.observable.ObservableFilter$FilterObserver.onNext(ObservableFilter.java:52) 在 io.reactivexserver.ObservableFilter.java:52) java:113) 在 io.reactivex.internal.operators.observable.ObservableDebounceTimed$DebounceTimedObserver.emit(ObservableDebounceTimed.java:140) 在 io.reactivex.internal.operators.observable.ObservableDebounceTimed$DebounceEmservable.java:140)在 io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:61) 在 io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:52) 在 java.util.concurrent.FutureTask.run(FutureTask.run(FutureTask) .java:237) 在 java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:272) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 在 java .util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 在 java.lang.Thread.run(Thread.java:761)
堆栈跟踪说明了一切:您正在主线程(UI 线程)上运行网络调用,这是不允许的,因为它阻塞了 UI。
subscribeOn
时使用subscribeOn
和observeOn
。
api.getData()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
在此处阅读有关subscribeOn
和observeOn
之间差异的更多信息。
将来,还请提供您使用的代码并正确格式化您的帖子。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.