繁体   English   中英

首先为什么我会在 Rxjava2 和 Retrofit 中出现这个错误? 第二 我应该直接使用 Wea​​kReference 还是 Activity?

[英]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时使用subscribeOnobserveOn

api.getData()
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())

此处阅读有关subscribeOnobserveOn之间差异的更多信息。

将来,还请提供您使用的代码并正确格式化您的帖子。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM