मैं नए RX जावा जहां के बजायएंड्रॉयड rxJava पुराना वापस
Observable.create(new Observable.OnSubscribeFunc<T>() {...});
इस प्रयोग किया जाता है का उपयोग कर रहा साथ निपटने में त्रुटि: (निंदा की वजह से)
Observable.create(new Observable.OnSubscribe<T>() {...});
(यह सबसे में महत्वपूर्ण हो सकता उदाहरण, ट्यूटोरियल, स्पष्टीकरण पुराने का उपयोग करता है ...)
ठीक है, मेरी समस्या को देखते हैं। मेरे पास जावा क्लास है, इसके प्रासंगिक भाग हैं:
private interface ApiManagerService {
@FormUrlEncoded
@POST("/login")
User getUser(@Field("username") String userName, @Field("password") String password);
}
private static RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(HOST)
.setLogLevel(RestAdapter.LogLevel.FULL)
.build();
private static ApiManagerService apiManager = restAdapter.create(ApiManagerService.class);
public static Subscription login(final String userName, final String password, Observer<User> observer) {
return Observable.create(new Observable.OnSubscribe<User>() {
@Override
public void call(Subscriber<? super User> subscriber) {
try {
User user = apiManager.getUser(userName, password);
subscriber.onNext(user);
subscriber.onCompleted();
} catch (RetrofitError e) {
subscriber.onError(e);
} catch (Throwable e) {
subscriber.onError(e);
}
}
}
).subscribeOn(Schedulers.io())
.retry(3)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
}
यह कोड लगभग ठीक है, अगर सब कुछ ठीक है। लेकिन अगर मैं एक जानबूझकर त्रुटि करता हूं, जैसे कि मैं वाईफाई बंद करता हूं .. रेट्रोफिट से "UnKnownHostException" प्राप्त करें ... क्योंकि इसे रीक्रोफिट कॉल (getUser) पर प्रयास करने की कोशिश करें। लेकिन एरर (थ्रोबल टी) पर त्रुटि को संभालने के बजाय -> जहां मैं संभाल सकता हूं, यह ऐप को क्रैश करता है। तो ऐसा लगता है कि त्रुटि कभी पकड़ने वाले ब्लॉक तक नहीं पहुंचती है। अजीब बात यह है कि HTTP त्रुटियों (जैसे 404, 401 इत्यादि) को पकड़ लिया जाता है, इरर (...) द्वारा प्राप्त किया जाता है और सब कुछ ठीक है।
सब कुछ दुर्घटना से पहले 3 बार जाता है, जैसे .retry (3) लेकिन कोई भी पकड़ खंड में नहीं आता है।
संपादित करें 1
LogCat आउटपुट:
01-08 16:19:31.576 15285-16162/asd.bdef.gh D/Retrofit﹕ ---- ERROR https://testapi.com/api/login
01-08 16:19:31.606 15285-16162/asd.bdef.gh D/Retrofit﹕ java.net.UnknownHostException: Unable to resolve host "testapi.com": No address associated with hostname
at java.net.InetAddress.lookupHostByName(InetAddress.java:394)
at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
at java.net.InetAddress.getAllByName(InetAddress.java:214)
at com.squareup.okhttp.internal.Network$1.resolveInetAddresses(Network.java:29)
at com.squareup.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:259)
at com.squareup.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:233)
at com.squareup.okhttp.internal.http.RouteSelector.nextUnconnected(RouteSelector.java:159)
at com.squareup.okhttp.internal.http.RouteSelector.next(RouteSelector.java:133)
at com.squareup.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:314)
at com.squareup.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:237)
at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:423)
at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:105)
at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:239)
at com.squareup.okhttp.internal.huc.DelegatingHttpsURLConnection.getOutputStream(DelegatingHttpsURLConnection.java:218)
at com.squareup.okhttp.internal.huc.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:25)
at retrofit.client.UrlConnectionClient.prepareRequest(UrlConnectionClient.java:68)
at retrofit.client.UrlConnectionClient.execute(UrlConnectionClient.java:37)
at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:321)
at retrofit.RestAdapter$RestHandler.access$100(RestAdapter.java:220)
at retrofit.RestAdapter$RestHandler$1.invoke(RestAdapter.java:265)
at retrofit.RxSupport$2.run(RxSupport.java:55)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:390)
at java.util.concurrent.FutureTask.run(FutureTask.java:234)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at retrofit.Platform$Android$2$1.run(Platform.java:142)
at java.lang.Thread.run(Thread.java:841)
01-08 16:19:31.606 15285-16162/asd.bdef.gh D/Retrofit﹕ ---- END ERROR
01-08 16:19:31.977 15285-15285/asd.bdef.gh D/AndroidRuntime﹕ Shutting down VM
01-08 16:19:31.977 15285-15285/asd.bdef.gh W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x41c9d8b0)
01-08 16:19:31.977 15285-15285/asd.bdef.gh E/AndroidRuntime﹕ FATAL EXCEPTION: main
दिया एपीआई पते के असली नहीं है, लेकिन असली पहुंचा जा सकता है। मैंने एरर हैंडलिंग का परीक्षण करने के लिए वाईफाई बंद कर दिया।
और एक और उपयोग-मामला: यदि मैं अवलोकन योग्य में जोड़ता हूं .ऑनएक्सप्शन रेस्यूमनेक्स्ट ([2 अवलोकन योग्य]) यह दूसरे अवलोकन करने योग्य है, और यह क्रैश नहीं होता है। लेकिन यह समस्या का समाधान नहीं है।
संपादित 2
ApiManager.login(userName, pass, new Observer<User>() {
@Override
public void onCompleted() { }
@Override
public void onError(Throwable e) {
DialogManager.showBasicErrorDialog(getApplicationContext(), e.getLocalizedMessage());
logger.showLog("Login Not ok");
e.printStackTrace();
}
@Override
public void onNext(User user) {
logger.showLog("login ok, user: " + user.getName().toString());
{...}
}
});
संपादित 3
FATAL EXCEPTION: main
rx.exceptions.OnErrorFailedException: Error occurred when trying to propagate error to Observer.onError
at rx.observers.SafeSubscriber._onError(SafeSubscriber.java:175)
at rx.observers.SafeSubscriber.onError(SafeSubscriber.java:97)
at rx.internal.operators.NotificationLite.accept(NotificationLite.java:144)
{...}
Caused by: java.lang.NullPointerException: Attempt to read from field 'rx.functions.Action0 rx.schedulers.TrampolineScheduler$TimedAction.action' on a null object reference
at rx.schedulers.TrampolineScheduler$InnerCurrentThreadScheduler.enqueue(TrampolineScheduler.java:85)
की मदद करने के लिए अग्रिम धन्यवाद।
आप अपने स्टैक ट्रेस/logcat उत्पादन पोस्ट कर सकते हैं? कॉलिंग कोड कैसा दिखता है (पर्यवेक्षक परिभाषा)? –
इसे संपादित किया गया है .. लेकिन वास्तव में यह बहुत प्रासंगिक नहीं है, क्योंकि त्रुटि उद्देश्य पर है। ... –
उपर्युक्त आउटपुट आपके ऐप को क्रैशिंग_ नहीं है - यह है [त्रुटि लॉगिंग रेट्रोफिट] (https://github.com/square/retrofit/blob/2c1c6ec370f88e21ac219d8f343f1f6d904c1c87/retrofit/src/main/java/retrofit/RestAdapter.java # L495)। क्या आपके पास लॉगकैट फ़िल्टर सक्षम है? ... –