2015-01-08 12 views
11

मैं नए 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) 

की मदद करने के लिए अग्रिम धन्यवाद।

+0

आप अपने स्टैक ट्रेस/logcat उत्पादन पोस्ट कर सकते हैं? कॉलिंग कोड कैसा दिखता है (पर्यवेक्षक परिभाषा)? –

+0

इसे संपादित किया गया है .. लेकिन वास्तव में यह बहुत प्रासंगिक नहीं है, क्योंकि त्रुटि उद्देश्य पर है। ... –

+0

उपर्युक्त आउटपुट आपके ऐप को क्रैशिंग_ नहीं है - यह है [त्रुटि लॉगिंग रेट्रोफिट] (https://github.com/square/retrofit/blob/2c1c6ec370f88e21ac219d8f343f1f6d904c1c87/retrofit/src/main/java/retrofit/RestAdapter.java # L495)। क्या आपके पास लॉगकैट फ़िल्टर सक्षम है? ... –

उत्तर

0

ऐसा लगता है कि आप एक मुद्दा में चल रहे हो सकता है RxJava 1.0 के रूप में निर्धारित किया गया है:

TrampolineScheduler NullPointerException

+1

मैं rxjava के एंड्रॉइड मॉड्यूल का उपयोग कर रहा हूं, अब जेसीएन्टर पर नवीनतम है 0.20.7 निर्भरता: 'com.netflix.rxjava संकलित करें: rxjava-android: 0.20.7' –

+1

[RxAndroid] का नया संस्करण (https: // github.com/ReactiveX/RxAndroid) में एक अलग पहचानकर्ता है - संकलन 'io.reactivex: rxandroid: 0.24.0'। आपको अपने RxJava कोर मॉड्यूल को 1.0 तक अपग्रेड करना होगा। –

+0

यह मुझे लगता है कि समस्या होगी। @AdamS मुझे यकीन नहीं है कि आपका क्या मतलब है "आपको अपने RxJava कोर मॉड्यूल को 1.0 में अपग्रेड करना होगा।" वैसे आपके उत्तरों के लिए धन्यवाद। –

3

आप रेट्रोफिट के साथ अपने स्वयं प्रत्यक्ष निर्माण करने के लिए रेट्रोफिट सीधे प्रत्यक्ष लौट सकते हैं के रूप में की जरूरत नहीं है:

http://square.github.io/retrofit/

रेट्रोफिट भी एक वापसी प्रकार rx के साथ तरीकों का समर्थन करने के RxJava एकीकृत करता है।अवलोकन

@GET ("/ उपयोगकर्ता/{आईडी}/फोटो") अवलोकन करने योग्य getUserPhoto (@Path ("id") int id);

आप अपने दुर्घटना के स्टैकट्रेस पोस्ट कर सकते हैं (आप खुद त्रुटियों को संभालने के लिए नहीं होगा)? जैसा कि मैं आपको लगता हूं, कि आपका आवेदन क्रैश नहीं होना चाहिए।

+1

धन्यवाद, मैंने अभी कुछ गूढ़ सीखा है, मैंने कोड को संशोधित किया है, जैसा कि आपने सलाह दी है, मेरे सभी अवलोकन योग्य, और संशोधित: अवलोकन getUser (@ फ़ील्ड ("उपयोगकर्ता नाम") स्ट्रिंग उपयोगकर्ता नाम, @ फ़ील्ड ("पासवर्ड") स्ट्रिंग पासवर्ड); लेकिन समस्या अभी भी होती है। त्रुटि को नियंत्रित नहीं किया जाता है, ऐप दुर्घटनाग्रस्त हो जाता है। मुझे लगता है कि यह रेट्रोफिट की समस्या नहीं है, लेकिन आरएक्स। और स्टैकट्रैक जोड़ा गया। –

+0

वैसे, अगर मैं ऑब्जेक्ट के साथ इसे संभालने से पहले ऑब्जेक्ट के साथ कुछ करना चाहता हूं तो क्या होगा? -> यहां लॉग इन करें (उपयोगकर्ता नाम, पास) -> मैं उपयोगकर्ता ऑब्जेक्ट में 'क्रेडेंशियल्स' को सहेजना चाहता हूं, और ऐप में सभी लॉगिन स्थानों पर ही इसे लिखना अच्छा नहीं है। तो यहां यह पर्यवेक्षक लॉग इनस्क्रीन को बताने से पहले सुपर फ़ंक्शन की तरह काम कर सकता है कि कुछ खुश है। –

संबंधित मुद्दे