লাইভডাটার আলাদা মিউটেবল লাইভডেটা সাবক্লাস কেন আছে?


96

দেখে মনে হয় এটি কেবল পদ্ধতি এবং পদ্ধতিগুলি জনসাধারণের দ্বারা MutableLiveDataপৃথক করা হয়েছে , যেখানে সেগুলিতে সুরক্ষিত রয়েছে।LiveDatasetValue()postValue()LiveData

এই পরিবর্তনের জন্য পৃথক শ্রেণি তৈরি করার এবং কেবল সেই পদ্ধতিগুলিকে LiveDataনিজেই জনসাধারণ হিসাবে সংজ্ঞায়িত না করার কিছু কারণ কী ?

সাধারণভাবে বলতে গেলে, উত্তরাধিকারের এমন এক ধরণের রূপ (একমাত্র পরিবর্তনের নির্দিষ্ট কিছু পদ্ধতির দৃশ্যমানতা বাড়ানো) একটি সুপরিচিত অনুশীলন এবং এমন কিছু পরিস্থিতিতে কী রয়েছে যেখানে এটি কার্যকর হতে পারে (ধরে নিই আমরা সমস্ত কোডের অ্যাক্সেস পেয়েছি)?


10
এটি একটি নকশা সিদ্ধান্ত। LiveDataঅপরিবর্তনীয়, যেহেতু ক্লায়েন্ট অভ্যন্তরীণ রাষ্ট্র পরিবর্তন করতে পারে না, তাই থ্রেড-নিরাপদ
ব্ল্যাকবেল্ট

উত্তর:


138

ইন LiveData - Android বিকাশকারী ডকুমেন্টেশন , আপনার জন্য দেখতে পারেন LiveData, setValue()& postValue()পদ্ধতি সর্বজনীন নয়।

, যেহেতু এ MutableLiveData - Android বিকাশকারী ডকুমেন্টেশন , আপনি যে দেখতে পারেন, MutableLiveDataপ্রসারিত LiveDataএর অভ্যন্তরীণভাবে এবং দুই যাদু পদ্ধতি LiveDataহল প্রকাশ্যে এই উপলব্ধ এবং তারা setValue()& postValue()

setValue(): মানটি নির্ধারণ করুন এবং সমস্ত সক্রিয় পর্যবেক্ষকের কাছে মান প্রেরণ করুন, অবশ্যই মূল থ্রেড থেকে কল করা উচিত ।

postValue(): নির্ধারিত মানকে ওভাররাইড করতে মূল থ্রেডে কোনও টাস্ক পোস্ট করুন setValue(), অবশ্যই ব্যাকগ্রাউন্ড থ্রেড থেকে কল করা উচিত ।

সুতরাং, LiveDataহয় অপরিবর্তনীয়MutableLiveDataহয় LiveDataযা চপল & থ্রেড-নিরাপদ


36
লাইভডেটা অপরিবর্তনীয় এমনটি আসলে নয়, কেবল ভিউমোডেল ক্লাসের বাইরে এটি পরিবর্তন করা যায় না । ভিউমোডেল শ্রেণি এটি চাইলে এটি সংশোধন করতে পারে (যেমন একটি টাইমার ভিউমোডেল)। আপনি যদি ভিউমোডেল ক্লাসের বাইরে এটি পরিবর্তন করতে চান তবে আপনি মিউটেবল লাইভডেটা ব্যবহার করবেন।
এলিপটিকা

4
আসুন এই দৃশ্যের দিকে নেওয়া যাক সংগ্রহশালার প্যাটার্ন সহ একটি অ্যাপ্লিকেশন (সার্ভার + রুম) যেখানে ঘর সত্যের একক উত্স। অ্যাপ্লিকেশন কেবল রুম থেকে ডেটা পায়, যখন রুমটি সার্ভার থেকে আপডেট হয় update সার্ভার আপডেট রুম, বা লাইভ ডেটা থেকে ডেটা ব্যবহার করা যেতে পারে বলে পরিবর্তনীয় লাইভডেটা কি প্রয়োজনীয়?
13:25

4
লাইভডেটা বিমূর্ত, সুতরাং আপনি সরাসরি বা লাইভ ডেটা অবজেক্টটি বাড়ানো ছাড়া তৈরি করতে পারবেন না। পরিবর্তনীয় লাইভডেটা লাইভ ডেটা প্রসারিত করে।
সর্দার সমানসিওলু

4
লাইভডাটা এবং মিউটেবল লাইভডাটা-র লিঙ্কগুলি সরাসরি হ্রাস করা ডকুমেন্টেশনে লিঙ্ক। আমি যখন প্রকৃত লিঙ্কগুলির সাথে সম্পাদনা করার প্রস্তাব দিই কেন তা প্রত্যাখাত হয়েছিল?
ড্যানিয়েল

4
@ ড্যানিয়েল নিশ্চিত হন না কেন এটি পর্যালোচনা সারিতে থাকা অন্যান্য পর্যালোচকরা প্রত্যাখ্যান করেছিলেন। আমি পরিবর্তনটি অনুমোদন করেছি, ধন্যবাদ! :)
স্নেহ পান্ড্য

10

এটি সম্পূর্ণ MutableLiveData.javaফাইল:

package androidx.lifecycle;
/**
 * {@link LiveData} which publicly exposes {@link #setValue(T)} and {@link #postValue(T)} method.
 *
 * @param <T> The type of data hold by this instance
*/
@SuppressWarnings("WeakerAccess")
public class MutableLiveData<T> extends LiveData<T> {
    @Override
    public void postValue(T value) {
        super.postValue(value);
    }
    @Override
    public void setValue(T value) {
        super.setValue(value);
    }
}

তাই হ্যাঁ, পার্থক্য কেবল করে আসে postValueএবং setValueপাবলিক।

আমি যে মাথা ব্যবহারের কথা মনে করতে পারি তা ব্যবহারের একটি ক্ষেত্রে হ'ল কোটলিনে ব্যাকিং প্রোপার্টি ব্যবহার করে এনক্যাপসুলেশন । আপনি আপনার ক্লাসে কারসাজি করতে পেরেও LiveDataআপনার খণ্ড / ক্রিয়াকলাপ (ইউআই কন্ট্রোলার) এর কাছে প্রকাশ করতে পারেন ।MutableLiveDataViewModel

    class TempViewModel : ViewModel() {
        ...
        private val _count = MutableLiveData<Int>()
        val count: LiveData<Int>
            get() = _count
        public fun incrementCount() = _count.value?.plus(1)
        ...
    }

এইভাবে আপনার ইউআই কন্ট্রোলার এগুলি সম্পাদনা করতে সক্ষম না হয়ে কেবল মানগুলি পর্যবেক্ষণ করতে সক্ষম হবে। স্পষ্টতই, আপনার ইউআই কন্ট্রোলার TempViewModelপছন্দ মতো পাবলিক পদ্ধতি ব্যবহার করে মানগুলি সম্পাদনা করতে পারে incrementCount()

দ্রষ্টব্য : পরিবর্তনীয় / অপরিবর্তনীয় বিভ্রান্তি স্পষ্ট করতে -

data class User(var name: String, var age: Int)

class DemoLiveData: LiveData<User>()

var demoLiveData: LiveData<User>? = DemoLiveData()

fun main() {
    demoLiveData?.value = User("Name", 23) // ERROR
    demoLiveData?.value?.name = "Name" // NO ERROR
    demoLiveData?.value?.age = 23  // NO ERROR
}


0

মিউটেবল লাইভডেটা লাইভ ডেটা থেকে প্রসারিত হচ্ছে। লাইভডাটার সুরক্ষিত পদ্ধতিগুলি কেবল স্ব বা সাবক্লাস দ্বারা সম্বোধন করা যেতে পারে। সুতরাং এক্ষেত্রে মিউটেবল লাইভডেটা লাইভডাটার একটি সাব ক্লাস হওয়া এই সুরক্ষিত পদ্ধতিগুলি অ্যাক্সেস করতে পারে।

আপনি যা করতে চান তা একটি নজরে পর্যবেক্ষণ করা হয় এবং দেখুন যে কোনও পরিবর্তন আছে কিনা। তবে একই সময়ে আপনি কোনও "বহিরাগত" চান না যে নজিরটি আপনি পর্যবেক্ষণ করছেন তা পরিবর্তন করুন। এক অর্থে এটি একটি সমস্যা তৈরি করে, যেমন আপনি চান যে কোনও বিষয় যা পরিবর্তনযোগ্য এবং পরিবর্তনযোগ্য নয়, কোনও নতুন অবস্থা আপডেট করতে পারে এবং পরিবর্তনযোগ্য নয়, যাতে নিশ্চিত হওয়া যায় যে কেউ এই উদাহরণটি আপডেট করতে পারে না। এই দুটি বৈশিষ্ট্য একে অপরের সাথে বিরোধ করে তবে অতিরিক্ত স্তর তৈরি করে সমাধান করা যায়।

সুতরাং আপনি যা করছেন তা হ'ল আপনার ক্লাস, লাইভডাটা, এমন একটি ক্লাসের সাথে প্রসারিত করুন যা এর পদ্ধতিগুলি অ্যাক্সেস করতে পারে। সাব লেয়ার, এক্ষেত্রে পরিবর্তনীয় লাইভডেটা, তার পিতামাতার সুরক্ষিত পদ্ধতিগুলি (/ সুপার) অ্যাক্সেস করতে সক্ষম।

এখন আপনি দৃষ্টান্ত তৈরি করতে শুরু করুন এবং মিউটেবল লাইভডাটা সম্পর্কিত আপনার পর্যবেক্ষক উদাহরণ তৈরি করুন। একই সময়ে আপনি এই একই উদাহরণটিকে উল্লেখ করে একটি লাইভ ডেটা উদাহরণ তৈরি করেন। মিউটেবল লাইভডাটা ডেটা লাইভডাটা প্রসারিত করার কারণে যে কোনও মিউটেবল লাইভডাটা ডেটা হ'ল লাইভ ডেটা অবজেক্ট এবং তাই লাইভডাটা ভেরিয়েবল দ্বারা রেফারেন্স করা যায়।

এখন কৌশল প্রায় সম্পন্ন হয়েছে। আপনি কেবল লাইভডেটা উদাহরণটি উন্মোচন করেছেন, কেউ এর সুরক্ষিত পদ্ধতিগুলি ব্যবহার করতে পারে না, এবং এটি এটি সুপারের কাছে কাস্ট করতে পারে না (সম্ভবত সংকলন সময়ে, তবে এটি চলবে না: রানটাইম ত্রুটি)। এবং আপনি প্রকৃত উপ-শ্রেণীর উদাহরণটি ব্যক্তিগত রাখেন, সুতরাং উদাহরণের পদ্ধতিগুলি ব্যবহার করে যারা কেবল উদাহরণটির মালিক তাদেরাই এটি পরিবর্তন করতে পারবেন।

//create instance of the sub class and keep this private
private val _name: MutableLiveData<String> = MutableLiveData<String>()
//create an instance of the super class referring to the same instance
val name: LiveData<String> = _name
//assign observer to the super class, being unable to change it
name.value.observe(.....)

যখন কোনও পরিবর্তন প্রয়োগ করা হয় তখন সুপার ক্লাসটি সূচিত করে।

//change the instance by using the sub class
_name.postValue(...)
//or _name.setValue(...)

ব্লককোট সাধারণভাবে বলতে গেলে, উত্তরাধিকারের এমন এক ধরণের (একমাত্র পরিবর্তনের নির্দিষ্ট কিছু পদ্ধতির দৃশ্যমানতা বাড়ানো) একটি সুপরিচিত অনুশীলন এবং এমন কিছু পরিস্থিতিতে কী রয়েছে যেখানে এটি কার্যকর হতে পারে (ধরে নিই আমরা সমস্ত কোডের অ্যাক্সেস পেয়েছি)?

হ্যাঁ, এটি বেশ সুপরিচিত এবং উপরে বর্ণিত এটি একটি সাধারণ দৃশ্য। পর্যবেক্ষক প্যাটার্নটি সরিয়ে ফেলুন, এবং সেট থেকে তৈরি / ফর্ম আকারে তৈরি করুন এটির থেকে যতটা উপকার হবে। নির্ভর করে আপনি কোথায় এটি প্রয়োগ করেন, শেষ পর্যন্ত কোনও সুবর্ণ নিয়ম নেই।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.