কোটলিন ফ্লো বনাম অ্যান্ড্রয়েড লাইভ ডেটা


20

কোটলিন প্রবাহ সম্পর্কে আমার কিছু প্রশ্ন আছে

  1. আমি একাধিক টুকরো থেকে লাইভ ডেটা পর্যবেক্ষণ করতে পারি। আমি কি ফ্লো দিয়ে এটি করতে পারি? যদি হ্যাঁ তবে কীভাবে?
  2. map& ব্যবহার করে আমাদের একক লাইভ ডেটা থেকে একাধিক লাইভ ডেটা থাকতে পারে switchMap। একক উত্স ফ্লো থেকে একাধিক প্রবাহ পাওয়ার কী উপায় আছে?
  3. ব্যবহার করে MutableLiveDataআমি ভেরিয়েবল রেফারেন্স ব্যবহার করে যে কোনও জায়গা থেকে ডেটা আপডেট করতে পারি। প্রবাহের সাথে একই করার কোনও উপায় আছে কি?

আমার মতো ব্যবহারের ক্ষেত্রে রয়েছে: আমি এমন একটি SharedPreferencesব্যবহার পর্যবেক্ষণ callbackFlow{...}করব যা আমাকে একক উত্স প্রবাহ দেবে। সেই ফ্লো থেকে, আমি প্রতিটি কী-মান জোড়ার জন্য একাধিক প্রবাহ তৈরি করতে চাই।

এগুলি মূর্খ প্রশ্নগুলি শুনতে পারে। আমি আরএক্স এবং ফ্লো ওয়ার্ল্ডে নতুন।


আপনি কোন পদ্ধতির সমাধান করেছেন - ফ্লো বা লাইভ ডেটা ?
ইগোরগানাপলস্কি

2
বর্তমানে, আমি দেখার জন্য লাইভ ডেটা এবং অন্য সবার জন্য প্রবাহ ব্যবহার করছি। ভিউমোডেলে, আমি প্রবাহ পেয়েছি এবং টুকরোগুলি থেকে পর্যবেক্ষণ করার জন্য লাইভ ডেটা নির্গত করে।
zoha131

@ zoha131 আপনি এটি সঠিক উপায়ে করেন! যেহেতু লাইভডেটা কেবলমাত্র মূল থ্রেডে পর্যবেক্ষণ করা যায় সেগুলি <-> ভিউমোডেল ইন্টারঅ্যাকশন দেখতে পুরোপুরি ফিট করে। তারপরে প্রবাহ আপনাকে আপনার বাকি আর্কিটেকচারে আরও জটিল ক্রিয়াকলাপ করতে দেয়।
স্মোমার

উত্তর:


15

আমি একাধিক টুকরো থেকে লাইভ ডেটা পর্যবেক্ষণ করতে পারি। আমি কি ফ্লো দিয়ে এটি করতে পারি? যদি হ্যাঁ তবে কীভাবে?

হ্যাঁ. আপনি emitএবং এর সাথে এটি করতে পারেন collect। চিন্তা emitলাইভ ডেটার অনুরূপ postValueএবং collectঅনুরূপ observe। একটি উদাহরণ দেয়।

সংগ্রহস্থলের প্রয়োগ

// I just faked the weather forecast
val weatherForecast = listOf("10", "12", "9")

// This function returns flow of forecast data
// Whenever the data is fetched, it is emitted so that
// collector can collect (if there is any)
fun getWeatherForecastEveryTwoSeconds(): Flow<String> = flow { 
    for (i in weatherForecast) {
        delay(2000)
        emit(i)
    }
}

ViewModel

fun getWeatherForecast(): Flow<String> {
    return forecastRepository.getWeatherForecastEveryTwoSeconds()
}

টুকরা

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    // Collect is suspend function. So you have to call it from a 
    // coroutine scope. You can create a new coroutine or just use 
    // lifecycleScope
    // https://developer.android.com/topic/libraries/architecture/coroutines
    lifecycleScope.launch {
            viewModel.getWeatherForecastEveryTwoSeconds().collect {
                    // Use the weather forecast data
                    // This will be called 3 times since we have 3 
                    // weather forecast data
            }
    }
}

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

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

ViewModel

fun getWeatherForecast(): Flow<String> {
    return flow {
        forecastRepository
            .getWeatherForecastEveryTwoSeconds(spendingDetailsRequest)
                .map {
                    it + " °C"
                }
                .collect {
                    // This will send "10 °C", "12 °C" and "9 °C" respectively
                    emit(it) 
                }
    }
}

তারপরে # 1 এর মতো ফ্র্যাগমেন্টে ডেটা সংগ্রহ করুন। এখানে যা ঘটে তা হল ভিউ মডেলটি সংগ্রহস্থল থেকে ডেটা সংগ্রহ করছে এবং খণ্ডটি ভিউ মডেল থেকে ডেটা সংগ্রহ করছে।

মিউটেবল লাইভডেটা ব্যবহার করে আমি ভেরিয়েবল রেফারেন্সটি ব্যবহার করে যে কোনও জায়গা থেকে ডেটা আপডেট করতে পারি। প্রবাহের সাথে একই করার কোনও উপায় আছে কি?

আপনি প্রবাহের বাইরে এমিটের মূল্য নির্ধারণ করতে পারবেন না। কোড ব্লক অভ্যন্তরে প্রবাহ কেবল তখনই কার্যকর করা হয় যখন কোনও সংগ্রাহক থাকে। তবে আপনি লাইভ ডেটা থেকে লাইভডাটা ডেটা এক্সটেনশন ব্যবহার করে প্রবাহকে লাইভ ডেটাতে রূপান্তর করতে পারেন।

ViewModel

fun getWeatherForecast(): LiveData<String> {
    return forecastRepository
    .getWeatherForecastEveryTwoSeconds()
    .asLiveData() // Convert flow to live data
}

আপনার ক্ষেত্রে আপনি এটি করতে পারেন

private fun getSharedPrefFlow() = callbackFlow {
    val sharedPref = context?.getSharedPreferences("SHARED_PREF_NAME", MODE_PRIVATE)
    sharedPref?.all?.forEach {
        offer(it)
    }
}

getSharedPrefFlow().collect {
    val key = it.key
    val value = it.value
}

সম্পাদন করা

@ মন্তব্যে তার মন্তব্যের জন্য ধন্যবাদ। getWeatherForecastফাংশনের জন্য ভিউ মডেলে নতুন প্রবাহ তৈরি করা আসলে অপ্রয়োজনীয়। এটি হিসাবে আবার লেখা যেতে পারে

fun getWeatherForecast(): Flow<String> {
        return forecastRepository
                .getWeatherForecastEveryTwoSeconds(spendingDetailsRequest)
                    .map {
                        it + " °C"
                    }
    }

আমি জানি না তবে আমার একটি ধারণা ছিল যে আমি একক প্রবাহের জন্য একাধিক জায়গায় সংগ্রহ () ফাংশনটি কল করতে পারি না। উত্তরের জন্য ধন্যবাদ.
zoha131

1
না। আপনি একাধিক জায়গায় একই প্রবাহ সংগ্রহ করতে পারেন। val sharedPref = getSharedPref()এবং আপনি একাধিক জায়গায় সংগ্রহ ব্যবহার করতে পারেন sharedPref.collect {}। একমাত্র জিনিস কারণ সংগ্রহ স্থগিত করা হয়, আপনাকে এটি কর্টিন ব্লক থেকে কল করা দরকার। এবং এনপি :) সাহায্য করে খুশি :)
ফাতিহ

আমার তৃতীয় প্রশ্নের জন্য, কাজটি একটি সম্প্রচার চ্যানেল হতে পারে।
zoha131

লাইভ ডেটার পরিবর্তে চ্যানেল ব্যবহার করার জন্য আপনি এই প্রতিশ্রুতিটি পরীক্ষা করতে পারেন। github.com/android/plaid/pull/770/commits/…
ফাতিহ

1
হ্যাঁ তুমিই ঠিক. এখান থেকেই প্রবাহ আসে Channel চ্যানেলগুলিতে আপনার যত্ন নিতে হবে প্রচুর পরিমাণে এবং সেগুলি হ'ল অর্থ তারা পর্যবেক্ষক না থাকলেও সর্বদা খোলা থাকে। তবে প্রবাহের সাথে আপনি কোনও উদ্বেগ ছাড়াই একই সুবিধা পেতে পারেন কারণ তারা শীত are সুতরাং চ্যানেলের পরিবর্তে আমি মনে করি প্রবাহটি ব্যবহার করা ভাল
ফাতিহ

3

Flow.asLiveData()নতুন androidx.lifecycleকেটিএক্স প্যাকেজগুলিতে একটি নতুন এক্সটেনশন ফাংশন রয়েছে । আপনি আমার নিবন্ধে আরও শিখতে পারেন: https://www.netguru.com/codestories/android-coroutines-%EF%B8%8Fin-2020


আমাদের কখন এটি ব্যবহার করা দরকার?
ইগোরগানাপলস্কি

1
যখন আপনি এমন কোনও এপিআই সন্তুষ্ট করতে চান যা ফ্লো উদাহরণ সহ লাইভ ডেটা প্রয়োজন
স্যামুয়েল

গুগলের মতে আমাদের লাইভডাটা বা ফ্লো নির্বাচন করতে হবে : কোডল্যাবস.ডিভেলগ্রাসগুলি.com
codelabs

1

3-স্তরের আর্কিটেকচারে: ডেটা-ডোমেন-উপস্থাপনা, ফ্লোটি ডাটা লেয়ারে (ডাটাবেসগুলি, নেটওয়ার্ক, ক্যাশে ...) এবং তারপরে হওয়া উচিত ফ্লোটি স্যামুয়েল আরবানউইচজ উল্লিখিত আপনি লাইভডাটাতে ফ্লো মানচিত্র করতে পারেন।

সাধারণভাবে, ফ্লো আরক্সজাবার জন্য পর্যবেক্ষণযোগ্য (বা প্রবাহমান) প্রায় তাই। লাইভডাটা দিয়ে এটিকে বিভ্রান্ত করবেন না।

আরও এখানে: https://medium.com/@elizarov/cold-flows-hot-channels-d74769805f9


এক-শট ক্রিয়াকলাপের জন্য (অর্থাত্ ডাটাবেস পঠিত) লাইভডেটা যথেষ্ট is
ইগোরগানাপলস্কি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.