2017-06-12 12 views
6

मेरे पास एकाधिक व्यूहोल्डर हैं जो वर्टिकल रीसाइक्लर व्यू के अंदर अलग-अलग दृश्यों के रूप में काम करते हैं। मैं नए आर्किटेक्चर घटक ViewModel के साथ अभ्यास कर रहा हूं।पुनर्चक्रण दृश्य एडाप्टर के अंदर आर्किटेक्चर घटक ViewModel का उपयोग कैसे करें?

मेरे व्यूमोडेल के अंदर मेरे पास कुछ MutableLiveData सूचियां हैं जिन्हें मैं देखना चाहता हूं। लेकिन मैं कैसे गतिविधि लीक बिना

ViewModelProviders.of((AppCompatActivity)getActivity()).get(FilterViewModel.class) 

और

mFilterViewModel.getCountries().observe(this, new Observer<ArrayList<TagModel>>() { 
      @Override 
      public void onChanged(@Nullable ArrayList<TagModel> tagModels) { 

      } 
     }); 

फोन या एडाप्टर के अंदर गतिविधि बचा सकता है।

मेरी ViewModel

public class FilterViewModel extends ViewModel { 

private final MutableLiveData<ArrayList<TagModel>> mCountries; 
private final MutableLiveData<ArrayList<TagModel>> mSelectedCountryProvinceList; 
private final MutableLiveData<ArrayList<TagModel>> mDistanceList; 

public FilterViewModel(){ 

    mCountries = new MutableLiveData<>(); 
    mSelectedCountryProvinceList = new MutableLiveData<>(); 
    mDistanceList = new MutableLiveData<>(); 

    TagStore.getInstance().subscribe(new StoreObserver<TagSearchList>() { 
     @Override 
     public void update(TagSearchList object) { 
      mCountries.setValue(object.getCountries()); 
     } 

     @Override 
     public void update(int id, TagSearchList object) { 
      if (id == 5){ 
       TagStore.getInstance().unSubcribe(this); 
       update(object); 
      } 
     } 

     @Override 
     public void error(String error) { 

     } 
    }).get(5,"parent"); 

    TagStore.getInstance().subscribe(new StoreObserver<TagSearchList>() { 
     @Override 
     public void update(TagSearchList object) { 
      mSelectedCountryProvinceList.setValue(object.toList()); 
     } 

     @Override 
     public void update(int id, TagSearchList object) { 
      if (id == 6){ 
       TagStore.getInstance().unSubcribe(this); 
       update(object); 
      } 
     } 

     @Override 
     public void error(String error) { 

     } 
    }).get(6,"parent"); 

    TagStore.getInstance().subscribe(new StoreObserver<TagSearchList>() { 
     @Override 
     public void update(TagSearchList object) { 
      mDistanceList.setValue(object.toList()); 
     } 

     @Override 
     public void update(int id, TagSearchList object) { 
      if (id == 51){ 
       TagStore.getInstance().unSubcribe(this); 
       update(object); 
      } 
     } 

     @Override 
     public void error(String error) { 

     } 
    }).get(51,"parent"); 

} 

public void selectCountry(final TagModel country){ 
    TagStore.getInstance().subscribe(new StoreObserver<TagSearchList>() { 
     @Override 
     public void update(TagSearchList object) { 
      mSelectedCountryProvinceList.setValue(object.toList()); 
     } 

     @Override 
     public void update(int id, TagSearchList object) { 
      if (id == country.getId()){ 
       TagStore.getInstance().unSubcribe(this); 
       update(object); 
      } 
     } 

     @Override 
     public void error(String error) { 

     } 
    }).get(country.getId(),"parent"); 
} 

public LiveData<ArrayList<TagModel>> getCountries(){ 
    return mCountries; 
} 

public LiveData<ArrayList<TagModel>> getDistances(){ 
    return mDistanceList; 
} 

public LiveData<ArrayList<TagModel>> getProvinces(){ 
    return mSelectedCountryProvinceList; 
} 

}

+0

हाय। आप इसके बजाय एंड्रॉइड डेटा बाइंडिंग का उपयोग क्यों नहीं करना चाहते हैं? – JuliaKo

+0

हाय @ जुलिआको, मेरे ऐप को एमवीवीएम में दोबारा करने का मेरा इरादा नहीं है। फिलहाल मैं एमवीपी का उपयोग करता हूं। मैं लाइफसाइकिल समस्याओं को हल करने, डेटा को पुनः लोड करने और अनावश्यक पर्यवेक्षकों को हल करने के लिए एमवीपी ढांचे के साथ व्यूमोडेल क्लास का उपयोग करना चाहता हूं। –

+0

मुझे लगता है कि आपको बाध्यकारी एडाप्टर को कार्यान्वित करने की आवश्यकता है, और Google टीम डेटा बाध्यकारी जीवन चक्र को जागरूक करने जा रही है, लेकिन इसके लिए, जीवन चक्र को 1.0 स्थिर एपीआई हिट करने की आवश्यकता है। आप यहां खोले गए मुद्दे पर एक नज़र डाल सकते हैं: https://github.com/googlesamples/android-architecture-components/issues/34 – JuliaKo

उत्तर

0

इस मुद्दे पर मेरे समाधान है;

  • एक नया वेरिएबल (ViewModel) लेआउट के लिए (टुकड़ा या गतिविधि लेआउट) बनाने
  • अपनी गतिविधि या टुकड़ा में साथ ViewModelProviders
  • डेटा जो MutableLiveData में अपने recyclerView भरता पकड़ अपने ViewModel का उदाहरण मिलता है और यह निरीक्षण और मूल्य के साथ recyclerView के एडाप्टर भरने आप

मनाया यहाँ आप mut में अनुकूलक उदाहरण बनाने के लिए नहीं का निरीक्षण विधि सावधान रहना होगा। यदि आप इसे विधिवत विधि में बनाते हैं, तो यह लीक

+0

क्या आप समझा सकते हैं कि निरीक्षण विधि में एडाप्टर बनाने का कारण रिसाव क्यों होता है? –

0

बस भावी पाठकों के लिए होगा। समाधान मैं पेशकश कर सकते हैं:

  • गतिविधि में, बनाने ViewModelProvider उदाहरण:

    ViewModelProvider प्रदाता = ViewModelProviders.of (this);

  • इसके बाद, यह एडाप्टर के निर्माता

  • को गुजर एडाप्टर के ViewHolder कक्षा में एक निर्माता है, जो एक FilterBinding उदाहरण लेता है और कार्यान्वित बनाने

    super(binding.getRoot());

  • अंदर onCreateViewHolder विधि बस का दृष्टांत उदाहरण के लिए, बाध्यकारी, उदाहरण के लिए, DataBindingUtil.inflate (...) और एक व्यूहोल्डर इंस्टेंस लौटाएं, जिसने इस बाध्यकारी को कन्स्ट्रक्टर द्वारा निर्भरता के रूप में लिया;

  • व्यूहोल्डर वर्ग के अंदर एक विधि बनाएं, जो एक टैगमोडेल लेता है (या यह आपके लिए बिल्कुल सही है, क्योंकि आपने अपने एडाप्टर को नहीं देखा है और स्पष्ट रूप से समझ नहीं आता है कि आपके तर्क में पहले से क्या चल रहा है) निष्पादित करता है बाइंडिंग:

    if (mBindings == null) { FilterViewModel vm = viewModelProvider.get(FilterViewModel.class); /*or instantiate? I am not sure about caching here, honestly. If you chose instantiating, then passing ViewModelProvider to the adapter is not needed*/ mBindings.setViewModel(vm); } mBindings.getViewModel(setItem(item)); mBindings.executePendingBindings();

  • और, पिछले के लिए, बस onBindViewHolder अंदर इस viewholder के बंधन विधि पर अमल (...)

ईमानदारी से, मुझे नहीं लगता कि यह तरीका अच्छा और सुंदरता है, लेकिन यह सब मैं पेशकश कर सकता हूं।

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