কোটলিন ফ্লো বনাম লাইভডাটা


10

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

প্রবাহ সহ উদাহরণ:

ViewModel

val items = repository.fetchItems().asLiveData()

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

fun fetchItems() = itemDao.getItems()

দাও

@Query("SELECT * FROM item")
fun getItems(): Flow<List<Item>>

লাইভডাটা সহ উদাহরণ:

ViewModel

val items = repository.fetchItems()

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

fun fetchItems() = itemDao.getItems()

দাও

@Query("SELECT * FROM item")
fun getItems(): LiveData<List<Item>>

রুম বা রেট্রোফিটের সাথে কাজ করার জন্য আমি কর্টাইন এবং ফ্লো ব্যবহার করে প্রকল্পগুলির কয়েকটি উদাহরণ দেখতে চাই। আমি কেবলমাত্র একটি গুগলের টুডো নমুনা পেয়েছি যেখানে কর্টাইনগুলি এক-শট আনার জন্য ব্যবহার করা হয় এবং তারপরে পরিবর্তিত হওয়ার সাথে সাথে ম্যানুয়ালি ডেটা পুনরায় পাঠানো হয়।

উত্তর:


3

Flowধরণের একটি reactive stream(rxjava মত)। বিভিন্ন অপারেটরগুলির একটি গুচ্ছ রয়েছে যেমন .map, buffer()(আরএক্সজাবের তুলনায় অপারেটরের কম)। সুতরাং, মধ্যে মূল পার্থক্য এক LiveDataএবং Flowযে তোমার দর্শন লগ করা মানচিত্র সাবস্ক্রাইব করতে পারেন হয় computation / transformationব্যবহার কিছু অন্যান্য থ্রেড

 flowOn(Dispatcher....). 

সুতরাং, উদাহরণস্বরূপ: -

 flowOf("A","B","C").map { compute(it) }.flowOn(Dispatchers.IO).collect {...} // U can change the execution thread of the computation ( by default its in the same dispatcher as collect )

সঙ্গে LiveDataএবং mapউপরোক্ত নাকিসুরে কথা সরাসরি অর্জন করা!

সুতরাং এটি সঞ্চিত্রে স্টোরেজ পর্যায়ে প্রবাহ রাখতে এবং লিভিটাটিকে ইউআই এবং সংগ্রহস্থলের মধ্যে একটি সেতু করার পরামর্শ দেওয়া হয়!

মূল পার্থক্যটি হ'ল flowবিভিন্ন অপারেটরগুলির একটি গুচ্ছ পেয়েছে যা livedataনেই! তবে আবার, আপনি কীভাবে আপনার প্রকল্পটি তৈরি করতে চান তা আপনার!


3

নামটি যেমন বোঝায়, আপনি একাধিক সংশ্লেষযুক্ত গণনা করা মানগুলির ধারাবাহিক প্রবাহের মতো প্রবাহের কথা ভাবতে পারেন। আমার দৃষ্টিকোণ থেকে লাইভডেটা এবং ফ্লোর মধ্যে প্রধান পার্থক্যটি হ'ল একটি প্রবাহ ক্রমাগত ফলাফলগুলি প্রকাশ করে যখন লাইভডেটা আপডেট হবে যখন সমস্ত ডেটা আনবে এবং একসাথে সমস্ত মান ফিরে আসবে। আপনার উদাহরণে আপনি একক মান আনছেন, যা আমার মতে ফ্লো তৈরি হয়েছিল ঠিক তা নয়।

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

private fun render(stuffToPlay: List<Any>): Flow<Sample> = flow {
     val sample = Sample()
     // computationally intensive operation on stuffToPlay
     Thread.sleep(2000)
     emit(sample)
}

তারপরে আপনার 'প্লেব্যাক' ফাংশনে আপনি উদাহরণস্বরূপ ফলাফলগুলি প্রদর্শন করতে পারেন যেখানে স্টাফটপ্লে রেন্ডার করার জন্য অবজেক্টগুলির একটি তালিকা, যেমন:

playbackJob = GlobalScope.launch(Dispatchers.Default) {

    render(stuffToPlay)
        .buffer(1000)   // tells the Flow how many values should be calculated in advance

        .onCompletion {
            // gets called when all stuff got played
        }
        .collect{sample ->
           // collect the next value in the buffered queue
           // e.g. display sample
        }
}

প্রবাহের একটি গুরুত্বপূর্ণ বৈশিষ্ট্য হ'ল এটি নির্মাতা কোড (এখানে ফাংশন রেন্ডার করে) কেবল কার্যকর হয়, যখন এটি সংগ্রহ করা হয়, সুতরাং এটি একটি শীতল প্রবাহ।

আপনি অ্যাসিঙ্ক্রোনাস ফ্লোতেও ডক্সগুলি উল্লেখ করতে পারেন

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