Chcę zażądać adresu URL za pomocą okhttp w innym wątku (jak wątek IO) i uzyskać Response
w głównym wątku systemu Android, ale nie wiem, jak utworzyć Observable
.Używanie RxJava i Okhttp
Odpowiedz
RxAndroid
Pierwszy dodatek do uzależnień, a następnie utworzyć Observable
takiego:
Subscription subscription = Observable.create(new Observable.OnSubscribe<Response>() {
OkHttpClient client = new OkHttpClient();
@Override
public void call(Subscriber<? super Response> subscriber) {
try {
Response response = client.newCall(new Request.Builder().url("your url").build()).execute();
if (response.isSuccessful()) {
if(!subscriber.isUnsubscribed()){
subscriber.onNext(response);
}
subscriber.onCompleted();
} else if (!response.isSuccessful() && !subscriber.isUnsubscribed()) {
subscriber.onError(new Exception("error"));
}
} catch (IOException e) {
if (!subscriber.isUnsubscribed()) {
subscriber.onError(e);
}
}
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Response>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Response response) {
}
});
To zwróci url w innym wątku (IO gwintu) i obserwować go na Androidzie głównego wątku.
I na koniec, po wyjściu z ekranu, użyj subsribtion.unsubscribe()
, aby uniknąć wycieku pamięci.
Podczas korzystania z Observable.create
powinieneś napisać dużo kodu na płycie głównej, również musisz samodzielnie zarządzać subskrypcją. Lepszą alternatywą jest użycie defer. Postać doc:
nie tworzą się zaobserwować aż abonentów obserwatora, i tworzenia świeży zaobserwowania dla każdego obserwatora
The DEFER operator czeka do obserwatora zgadza się go, a następnie generuje Obserwowalne, zwykle z funkcją obserwowalną . Robi to ponownie dla każdego abonenta, więc chociaż każdy subskrybent może przypuszczać, że subskrybuje to samo Obserwowalne, w rzeczywistości każdy subskrybent otrzymuje swoją własną indywidualną sekwencję.
Więc jak Marcin Koziński wspomniano, po prostu trzeba to zrobić:
final OkHttpClient client = new OkHttpClient();
Observable.defer(new Func0<Observable<Response>>() {
@Override public Observable<Response> call() {
try {
Response response = client.newCall(new Request.Builder().url("your url").build()).execute();
return Observable.just(response);
} catch (IOException e) {
return Observable.error(e);
}
}
});
Łatwiej i bezpieczniej jest używać Observable.defer()
zamiast Observable.create()
:
final OkHttpClient client = new OkHttpClient();
Observable.defer(new Func0<Observable<Response>>() {
@Override public Observable<Response> call() {
try {
Response response = client.newCall(new Request.Builder().url("your url").build()).execute();
return Observable.just(response);
} catch (IOException e) {
return Observable.error(e);
}
}
});
ten sposób wypisania i ciśnienie wsteczne są obsługiwane dla Ciebie. Oto a great post by Dan Lew około create()
i defer()
.
Jeśli chcesz jechać na trasę Observable.create()
, powinna ona wyglądać bardziej jak w this library z rozmowami isUnsubscribed()
posypanymi wszędzie. I uważam, że nadal nie radzi sobie z przeciwciśnieniem.
Zdaję sobie sprawę, ten post jest trochę stary, ale jest nowy i bardziej wygodny sposób to zrobić teraz
Observable.fromCallable {
client.newCall(Request.Builder().url("your url").build()).execute()
}
Więcej informacji: https://artemzin.com/blog/rxjava-defer-execution-of-function-via-fromcallable/
Czy możesz wyjaśnić kod? Brak 'nowego' przed' Żądaniem', a następnie zgłasza błąd –
To nie jest Java, to jest Kotlin – feresr
Ops ... przepuściło to, przepraszam –
- 1. Robolectric + OkHttp + modernizacja + test jednostki rxJava
- 2. Używanie RxJava wewnątrz adaptera RecyclerView
- 3. Jak anulować zadanie z modernizacją i rxjava
- 4. RxJava i Retrofit2: NetworkOnMainThreadException
- 5. Realm, RxJava, asObservable() i doOnUnsubscribe()
- 6. Obsługa uwierzytelniania w Okhttp
- 7. OkHttp + Picasso + Retrofit
- 8. Przesyłanie plików z okhttp
- 9. Ustawienia proxy OkHttp
- 10. Wywołania asynchroniczne Android Okhttp
- 11. RxJava onErrorResumeNext()
- 12. Problemy wykorzystujące najnowsze słoiki z placu - modernizacji, okhttp, okio i okhttp-URLConnection
- 13. Jak działają funkcje RxJava doOnError i onErrorReturn?
- 14. Operatory obsługi błędów Retrofit 2 i RxJava
- 15. Retrofit/Rxjava i usługi oparte na sesji
- 16. Różnica między Java Współbieżność, Akka i RxJava?
- 17. RxJava onCompleted i onTerminate na głównym wątku
- 18. RxJava scalania debounced i nie debounced obserwable
- 19. Android OkHttp jak obsługiwać ETag
- 20. Przesyłanie obrazów za pomocą okHttp
- 21. poziom aplikacji okhttp instancja OkHttpClient
- 22. Square`s OkHttp. Pobierz postęp
- 23. RxJava Relay vs Przedmioty
- 24. filtr RxJava 'inny'
- 25. RxJava Fetching Observables Równolegle
- 26. Android RxJava, bez blokowania?
- 27. RxJava - Just vs Od
- 28. Pobierz i napisz plik z Retrofit i RxJava
- 29. flatZip w RxJava
- 30. RxJava Completabe andthen testowanie
Oprócz przyjętej Odpowiedź Saeed, byś chcesz zrezygnować z subskrypcji, aby uniknąć wycieków pamięci. Źródło: http://stackoverflow.com/a/34150022/1536976 autor: http://stackoverflow.com/users/3972175/esoxjem – Trilarion
@Trilarion twój link wydaje się przekierować na tę właśnie stronę (rekurencyjnie!) –
@VickyChijwani You ' w porządku. Chociaż, jeśli spojrzysz na link, odniosę się do innego pytania, które już nie istnieje (linki do tej strony i mój link nie są takie same). Nie wiem, co się tutaj dzieje i nie pamiętam, o co chodzi. Prawdopodobnie coś zostało usunięte gdzieś w międzyczasie. – Trilarion