Fatal Exception levée dans le Planificateur.Thread de travail avec la Rénovation 2 et Rx
C'est le code que j'utilise pour faire appel Http.
Je ne peux pas reproduire l'erreur, mais Bugsnag me dit que certains utilisateurs sont l'obtention de cette erreur : java.lang.IllegalStateException StrictMode.java
public class ApiManager {
public interface Callback<T> {
void onError(Throwable e);
void onSuccess(T result);
}
private ApiService _apiService;
public ApiManager() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BuildConfig.BASE_URL)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.client(ew OkHttpClient())
.build();
_apiService = retrofit.create(ApiService.class);
}
private <T> void execute(Observable<T> observable, final Callback<T> callback) {
observable.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<T>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
callback.onError(e);
}
@Override
public void onNext(T result) {
callback.onSuccess(result);
}
});
}
public void createUser(Callback<Void> callback) {
execute(_apiService.createUser(new User()), callback);
}
//Retrofit Service
public interface ApiService {
@POST("users")
Observable<Void> createUser(@Body User user);
}
}
Ici est la trace complète :
java.lang.IllegalStateException: Fatal Exception thrown on Scheduler.Worker thread.
at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:62)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:153)
at android.app.ActivityThread.main(ActivityThread.java:5340)
at java.lang.reflect.Method.invokeNative(Method.java:-2)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)
at dalvik.system.NativeStart.main(NativeStart.java:-2)
Caused by: rx.exceptions.UnsubscribeFailedException
at rx.observers.SafeSubscriber.onCompleted(SafeSubscriber.java:98)
at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.pollQueue(OperatorObserveOn.java:195)
at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber$2.call(OperatorObserveOn.java:162)
at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:153)
at android.app.ActivityThread.main(ActivityThread.java:5340)
at java.lang.reflect.Method.invokeNative(Method.java:-2)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)
at dalvik.system.NativeStart.main(NativeStart.java:-2)
Caused by: android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1128)
at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.close(OpenSSLSocketImpl.java:906)
at com.squareup.okhttp.Connection.closeIfOwnedBy(Connection.java:148)
at com.squareup.okhttp.OkHttpClient$1.closeIfOwnedBy(OkHttpClient.java:75)
at com.squareup.okhttp.internal.http.HttpConnection.closeIfOwnedBy(HttpConnection.java:137)
at com.squareup.okhttp.internal.http.HttpTransport.disconnect(HttpTransport.java:135)
at com.squareup.okhttp.internal.http.HttpEngine.disconnect(HttpEngine.java:573)
at com.squareup.okhttp.Call.cancel(Call.java:122)
at retrofit.OkHttpCall.cancel(OkHttpCall.java:162)
at retrofit.RxJavaCallAdapterFactory$CallOnSubscribe$1.call(RxJavaCallAdapterFactory.java:102)
at rx.subscriptions.BooleanSubscription.unsubscribe(BooleanSubscription.java:71)
at rx.internal.util.SubscriptionList.unsubscribeFromAll(SubscriptionList.java:124)
at rx.internal.util.SubscriptionList.unsubscribe(SubscriptionList.java:113)
at rx.Subscriber.unsubscribe(Subscriber.java:98)
at rx.internal.util.SubscriptionList.unsubscribeFromAll(SubscriptionList.java:124)
at rx.internal.util.SubscriptionList.unsubscribe(SubscriptionList.java:113)
at rx.Subscriber.unsubscribe(Subscriber.java:98)
at rx.internal.util.SubscriptionList.unsubscribeFromAll(SubscriptionList.java:124)
at rx.internal.util.SubscriptionList.unsubscribe(SubscriptionList.java:113)
at rx.Subscriber.unsubscribe(Subscriber.java:98)
at rx.observers.SafeSubscriber.onCompleted(SafeSubscriber.java:95)
at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.pollQueue(OperatorObserveOn.java:195)
at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber$2.call(OperatorObserveOn.java:162)
at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:153)
at android.app.ActivityThread.main(ActivityThread.java:5340)
at java.lang.reflect.Method.invokeNative(Method.java:-2)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)
at dalvik.system.NativeStart.main(NativeStart.java:-2)
J'ai aussi essayé de s'inscrire sur Sheduler.io()
et Scheduler.newThread()
, mais j'obtiens la même erreur.
Êtes-vous à l'aide de okhttp3?
Je suis en utilisant
La dernière version est com.squareup.retrofit2:rénovation:2.0.2 de sorte que vous ne devriez pas être à l'aide de la version bêta.
Je suis en utilisant
com.squareup.retrofit:retrofit:2.0.0-beta2
, mais je vois que la beta3 utilisation okhttp3. Je devrais peut-être mettre à jour ?La dernière version est com.squareup.retrofit2:rénovation:2.0.2 de sorte que vous ne devriez pas être à l'aide de la version bêta.
OriginalL'auteur Jérôme Boé | 2016-05-03
Vous devez vous connecter pour publier un commentaire.
Noter que ce n'est pas une solution permanente, mais il m'a aidé et qui pourrait vous aider. C'est trop long à mettre dans un commentaire.
Alors que j'utilisais la version spécifique de rénovation que vous avez mentionné, j'ai remarqué qu'il y avait un bug (déjà abordé) avec le
okhttp
bibliothèque et le rx de l'intégration avec la de rénovation.Je ne sais pas l'état de la correction, mais j'ai une solution rapide qui a été l'ajout de la rx flux
unsubscribeOn(Schedulers.io())
, comme suit:OriginalL'auteur Fred
Il ressemble à une mise à niveau vers
com.squareup.retrofit2:retrofit:2.0.2
à l'aide deokhttp3
résolu le problème.OriginalL'auteur Jérôme Boé
Mon expérience & suggère:
Vérifier votre
onError(Throwable e)
etonCompleted()
méthode de la mise en œuvre de l'Abonné, est tout possible peut provoquer une exception. Par exemple, NullPointerException etc.Rxjava ne peut pas attraper l'exception qui jettent de ces deux méthode. Et vous obtiendrez
java.lang.IllegalStateException: Fatal Exception thrown on Scheduler.Worker thread.
Qui vous même ne peut pas localiser l'exception de la source de la trace de la pile.OriginalL'auteur Loyea
Quelque chose de mauvais se produire dans
Observable.create()
si vous ne le catch cas cette question.Observable.create((Subscriber<? super Object subscriber) -> {
//something wrong occur in here ,you can surround these codes by try catch
});
OriginalL'auteur GaminTsai