2015-12-18 19 views
11

मुझे एहसास है कि मैं मेन थ्रेड पर subscribeOn()/observOn() का उपयोग कर रहा हूं। सब्सक्राइबऑन() में पास किए जा सकने वाले विकल्पों का सेट क्या है? विकल्प का सेट क्या है जो मैं देख सकता हूं()?आरएक्सजेवा और रेट्रोफिट 2: नेटवर्कऑनमेन थ्रेड अपवाद

12-17 21:36:09.154 20550-20550/rx.test D/MainActivity2: [onCreate] 
12-17 21:36:09.231 20550-20550/rx.test D/MainActivity2: starting up observable... 
12-17 21:36:09.256 20550-20550/rx.test D/MainActivity2: [onError] 
12-17 21:36:09.256 20550-20550/rx.test W/System.err: android.os.NetworkOnMainThreadException 

GovService.java

import java.util.List; 
import retrofit.Call; 
import retrofit.http.GET; 
import rx.Observable; 

public interface GovService { 
    @GET("/txt2lrn/sat/index_1.json") 
    Observable<MyTest> getOneTestRx(); 
} 

MyTest.java

public class MyTest { 
    private String name, url; 
    private int num; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getUrl() { 
     return url; 
    } 

    public void setUrl(String url) { 
     this.url = url; 
    } 

    public int getNum() { 
     return num; 
    } 

    public void setNum(int num) { 
     this.num = num; 
    } 

    @Override 
    public String toString() { 
     return "Name: " + this.name + ", num: " + this.num + ", url: " + this.url; 
    } 
} 

MainActivity2.java

import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.DefaultItemAnimator; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.support.v7.widget.Toolbar; 
import android.util.Log; 

import retrofit.GsonConverterFactory; 
import retrofit.Retrofit; 
import retrofit.RxJavaCallAdapterFactory; 
import rx.Observable; 
import rx.Subscriber; 
import rx.android.schedulers.AndroidSchedulers; 
import rx.schedulers.Schedulers; 

public class MainActivity2 extends AppCompatActivity { 
    private final String TAG = getClass().getSimpleName(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.d(TAG, "[onCreate]"); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     RecyclerView mRV = (RecyclerView) findViewById(R.id.rv); 
     mRV.setLayoutManager(new LinearLayoutManager(this));// setup LayoutManager 
     mRV.setItemAnimator(new DefaultItemAnimator());// setup ItemAnimator 

     // setup retrofit 
     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl("http://goanuj.freeshell.org") 
       .addConverterFactory(GsonConverterFactory.create()) 
       .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 
       .build(); 
     GovService service = retrofit.create(GovService.class); 

     Log.d(TAG, "starting up observable..."); 
     Observable<MyTest> o = service.getOneTestRx(); 
     o.subscribeOn(Schedulers.io()); 
     o.observeOn(AndroidSchedulers.mainThread()); 
     o.subscribe(new Subscriber<MyTest>() { 
      @Override 
      public void onCompleted() { 
       Log.d(TAG, "[onCompleted] "); 
      } 

      @Override 
      public void onError(Throwable t) { 
       Log.d(TAG, "[onError] "); 
       t.printStackTrace(); 
      } 

      @Override 
      public void onNext(MyTest m) { 
       Log.d(TAG, "[onNext] " + m.toString()); 
      } 
     }); 
    } 
} 
@akarnokd से

service.getOneTestRx() 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(new Subscriber<MyTest>() { 
     @Override 
     public void onCompleted() { 
      Log.d(TAG, "[onCompleted] "); 
     } 

     @Override 
     public void onError(Throwable t) { 
      Log.d(TAG, "[onError] "); 
      t.printStackTrace(); 
     } 

     @Override 
     public void onNext(MyTest m) { 
      Log.d(TAG, "[onNext] " + m.toString()); 
     } 
    }); 

महत्वपूर्ण नोट:

+0

कोशिश करने के लिए '.subscribeOn (Schedulers.newThread())'। यह न्यू थ्रेड में अवलोकन योग्य निष्पादित करेगा। –

उत्तर

24
करने के लिए अपने कोड के अंतिम भाग पुनर्लेखन

उल्लेख है कि एक कॉल श्रृंखला की जरूरत है यहाँ के रूप में क्योंकि नमूदार नहीं है वर्थ बिल्डर पैटर्न (जहां आप किसी मौजूदा ऑब्जेक्ट की सेटिंग्स को संशोधित करते हैं)

+3

उल्लेखनीय है कि किसी को यहां कॉल को चेन करने की आवश्यकता है क्योंकि अवलोकन करने वाला निर्माता निर्माता नहीं है (जहां आप किसी मौजूदा ऑब्जेक्ट की सेटिंग्स को संशोधित करते हैं)। – akarnokd

+1

स्पष्टीकरण भी उल्लेखनीय है। ओपी को इस तरह फिर से लिखना क्यों चाहिए, आपका संस्करण सही क्यों है? मैं खुद से नहीं पूछ रहा हूँ। एक अच्छा जवाब यह होना चाहिए। –

+1

कोई विचार RxJava 2 के साथ ऐसा कैसे करें? – Incinerator

7

आपको Observable.unsubscribeOn(Schedulers.io()) पर कॉल करना चाहिए, retrofit http-request के अंत में सदस्यता समाप्त कर देगा।

retrofit-rxjava-adapter

इसे इस तरह के कार्यों की RxJavaCallAdapterFactory में

if (!subscriber.isUnsubscribed()) { 
    subscriber.onCompleted(); 
} 

लेकिन जब subscriber एक SafeSubscriber है, यह unsubscribe अंत में फोन करता हूँ।

मेरे पास इस ऐप में यह समस्या है।

पूर्ण कोड:

o.subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .unsubscribeOn(Schedulers.io()); 
+1

हाँ, यह भी समाधान है: https://github.com/square/retrofit/issues/1328 - यह स्पष्ट रूप से रेट्रॉफिट 2 के रिलीज़ संस्करण में तय किया जाएगा, okhttp 2.7 के बाद आता है (जो यह पहले से बाहर आया है) । – ahmedre

+2

@ahmedre वे कभी नहीं करेंगे ... 'यह एक रेट्रोफिट या OkHttp समस्या नहीं है' – Inoy

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