2016-03-07 4 views
5

का उपयोग करके प्रतिलिपि भेजा गया था, वास्तविक संदर्भ के बजाय वास्तविक वस्तुओं की प्रति स्ट्रीमिंग करते समय और शेड्यूलर्स.आईओ थ्रेड पर इसे देखते हुए, प्रसिद्ध अपवाद संदेश के साथ एक क्रैश होता है "गलत धागे से दायरे का उपयोग वास्तविक वस्तुओं को केवल उनके द्वारा बनाए गए धागे में ही पहुंचा जा सकता है। "गलत थ्रेड अपवाद से दायरे का उपयोग, जबकि प्रतिलिपि प्रतिलिपि

कॉपी को थ्रेड मुक्त नहीं होना चाहिए? क्या मैं इसे एक धागे से उत्पन्न कर सकता हूं और इसे एक अलग धागे पर संसाधित कर सकता हूं?

इस प्रकार मैं देखरेख कर रहा हूं।

public Observable<Brand> getAllBrands() { 
    return realm.where(Brand.class) 
      .findAll() 
      .asObservable() 
      .flatMap(Observable::from) 
      .map(brand -> realm.copyFromRealm(brand)); 
} 

निम्नलिखित है कि मैं getAllBrands() को कैसे देखता हूं।

Observable<Brand> brandObservable = dataManager.getAllBrands(); 

    brandObservable.observeOn(AndroidSchedulers.mainThread()) 
      .subscribeOn(Schedulers.io()) 
      .subscribe(new Observer<Brand>() { 
       @Override 
       public void onCompleted() { 
        Log.d("reactive", "completed"); 
       } 

       @Override 
       public void onError(Throwable e) { 
        Log.d("reactive", e.getMessage()); 
       } 

       @Override 
       public void onNext(Brand brand) { 
        dataSource.add(brand.getName()); 
        myAdapter.notifyDataSetChanged(); 
       } 
      }); 
+1

आप जिस 'वास्तविक' का उपयोग कर रहे हैं वह 'io()' शेड्यूलर पर नहीं है। – EpicPandaForce

उत्तर

0

प्रश्न

मैं इसे एक धागे से उत्पादन और एक अलग धागे पर इसे संसाधित कर सकते हैं?

उत्तर नहीं है। आप here

में दायरे के विवरण पढ़ सकते हैं क्षेत्र फ़ाइलों से अधिक थ्रेड द्वारा पहुँचा जा सकता हालांकि समवर्ती, आप धागे के बीच रियल्म्स, क्षेत्र की वस्तुओं, प्रश्नों, और परिणाम को सौंपने नहीं कर सकते। धागा उदाहरण दिखाता है कि मल्टीथ्रेडिंग वातावरण में रीयलम का उपयोग कैसे करें।

+2

लेकिन सवाल 'copyFromRealm()' का उपयोग करके अलग-अलग ऑब्जेक्ट्स के बारे में है जो माना जाता है कि एक दायरे उदाहरण से संबद्ध नहीं है। – EpicPandaForce

7

यूआई धागे से क्षेत्र उदाहरण का उपयोग करते समय schedulers.io पर सदस्यता ले रहे हैं:

realm.where(Brand.class) 
     .findAll() 
     .asObservable() 
     .flatMap(Observable::from) 
     .map(brand -> realm.copyFromRealm(brand)) // realm instance on the wrong thread 
     .subscribeOn(schedulers.io());    

हैं क्या आप के बाद धागे भर में एक प्रश्न को स्थानांतरित करने के लिए एक आसान तरीका है, जो अभी भी काम-in- है यहां प्रगति: https://github.com/realm/realm-java/pull/1978। तब तक आप इस तरह यह अपने आप को ऐसा करने से यह आस-पास काम कर सकते हैं:

public Observable<Brand> getAllBrands(final Realm realm) { 
    return Observable.create(new Observable.OnSubscribe<List<Brand>>() { 
     @Override 
     public void call(final Subscriber<? super List<Brand>> subscriber) { 
      Realm obsRealm = Realm.getInstance(realm.getConfiguration()); 
      final RealmResults<Brand> results = obsRealm.where(Brand.class).findAll(); 
      final RealmChangeListener listener = new RealmChangeListener() { 
       @Override 
       public void onChange() { 
        subscriber.onNext(realm.copyFromRealm(results)); 
       } 
      }; 
      results.addChangeListener(listener); 
      subscriber.add(Subscriptions.create(new Action0() { 
       @Override 
       public void call() { 
        realm.removeChangeListener(listener); 
        realm.close(); 
       } 
      })); 

     } 
    }) 
    .flatMap(Observable::from); 
} 

ध्यान दें कि क्षेत्र Changelisteners केवल Looper धागे पर काम जो आप शायद एक एच करने के लिए अपने कार्यकर्ता धागा बदलने की जरूरत का मतलब है

HandlerThread bgThread = new HandlerThread("workerThread"); 
Handler handler = new Handler(bgThread.getLooper()); 

getAllBrands(realm).subscribeOn(HandlerScheduler.from(handler)); 
+0

मैं धागे भर में एक प्रश्न को स्थानांतरित करने की कोशिश नहीं कर रहा हूं। इसके बजाय, मैं अलग-अलग दायरे वस्तुओं की प्रति स्ट्रीम करने की कोशिश कर रहा हूं। क्या वास्तविक धागे के बावजूद अलग-अलग धागे में पृथक डेटा का उपयोग करना संभव नहीं है? – sam33r

+0

यह है, लेकिन 'मानचित्र (ब्रांड -> realm.copyFromRealm (ब्रांड)) में; 'ब्रांड यूआई थ्रेड पर बनाए गए ऑब्जेक्ट्स है और' schedulers.io()' थ्रेड पर पहुंचा है। मेरा समाधान उस के लिए एक कार्य-आसपास है ('schedulers.io()' थ्रेड पर क्वेरी निष्पादित करके) –

+0

अब मुझे "आप एक गैर-लूपर थ्रेड से श्रोता पंजीकृत नहीं कर सकते" प्राप्त कर रहे हैं। – sam33r

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