শেয়ারডপ্রিফারেন্সে কমিট () এবং প্রয়োগ () এর মধ্যে পার্থক্য কী


432

আমি SharedPreferencesআমার অ্যান্ড্রয়েড অ্যাপ্লিকেশন ব্যবহার করছি । আমি উভয় ব্যবহার করছি commit()এবং apply()পদ্ধতি ভাগ পক্ষপাত থেকে। আমি যখন এভিডি ২.৩ ব্যবহার করি তখন এটি কোনও ত্রুটি দেখায় না, তবে আমি যখন অ্যাভিডি ২.১-তে কোডটি চালাচ্ছি তখন apply()পদ্ধতিটি ত্রুটি দেখায়।

তাহলে এই দুজনের মধ্যে পার্থক্য কী? এবং কেবলমাত্র ব্যবহার commit()করেই আমি কোনও সমস্যা ছাড়াই পছন্দনীয় মানটি সঞ্চয় করতে পারি?


115
এটি এক বছরের পুরনো, তবে যাইহোক আমি এটি নিয়ে মন্তব্য করতে চলেছি, যদিও এটি সুস্পষ্ট হতে পারে, উত্তরের কোনও উত্তরই এই বিষয়টিকে বোঝায় না: সিঙ্ক্রোনাস apply()থাকাকালীন ডিস্ক I / O commit()তাত্পর্যপূর্ণভাবে তৈরি করবে। সুতরাং আপনার সত্যিই commit()ইউআই থ্রেড থেকে কল করা উচিত নয় ।
মিচিয়াকিগ

লক্ষণীয় বিষয়, যখন একাধিক SharedPreferences.Editor অবজেক্ট ব্যবহার করা হয়, তখন কলটি apply()জিতবে one অতএব, আপনি যদি নিশ্চিত হন যে কেবলমাত্র একটি SharedPreferences.Editor আপনার অ্যাপ্লিকেশন দ্বারা ব্যবহৃত হচ্ছে আপনি নিরাপদে তার apply()পরিবর্তে ব্যবহার করতে পারেন commit()
এওইউ

2
অ্যান্ড্রয়েড স্টুডিও লিন্ট সতর্কতা অনুসারে: প্রতিশ্রুতিবদ্ধ () তাত্ক্ষণিকভাবে এবং সিঙ্ক্রোনজ করে ডেটা সংরক্ষণ করবে। যাইহোক, প্রয়োগ করুন () এটিকে অবিচ্ছিন্নভাবে (পটভূমিতে) সংরক্ষণ করবে এবং এর ফলে কিছুটা কার্যকারিতা উন্নত করবে। এজন্য প্রয়োগ () কমিটের চেয়ে বেশি পছন্দ করা হয় () যদি আপনি এর রিটার্নের ধরণের (যদি ডেটা সাফল্যের সাথে সংরক্ষণ করা হয় বা না হয়) যত্ন না করে থাকেন।
রাহুল রায়না

ব্যবহারের সময় লিন্টের সতর্কতাটি অক্ষম করার কোনও উপায় আছে কি commit()?
কিয়েড

উত্তর:


654

apply()2.3 যোগ হয়েছিল, এটা করে থাকলে একটি বুলিয়ান সফলতা বা ব্যর্থতা ইঙ্গিত ফিরিয়ে আনে।

commit()আয় সত্য যদি কাজ সংরক্ষণ করুন, মিথ্যা অন্যথায়।

apply() অ্যান্ড্রয়েড ডেভ টিম লক্ষ্য করেছিল যে রিটার্নের মূল্যের বিষয়টি প্রায় কেউই খেয়াল করেনি, তাই এটি অ্যাসিনক্রোনাস হওয়ায় দ্রুত প্রয়োগ করুন।

http://developer.android.com/reference/android/content/SharedPreferences.Editor.html#apply ()


8
এই উত্তরটি সত্য তবে আমি অনুমান করি যে উপরের @ স্পেসমানাকির মন্তব্যটিতে সত্যও মূল্যবান তথ্য রয়েছে
আকসেল ফাতিহ

58
প্রতিশ্রুতিবদ্ধ () অবিলম্বে অবিচ্ছিন্ন স্টোরেজে তার ডেটা লিখে, অন্যদিকে প্রয়োগ () এটিকে পটভূমিতে পরিচালনা করবে।
ক্যাপচার.সওয়াগ

18
এটি একটি দৌড় অবস্থা তৈরি করে?
ChrisMcJava

42
আমি যদি প্রয়োগ () দিয়ে কিছু লিখি এবং ততক্ষনে তা পড়ার চেষ্টা করি তবে কী হবে? পাঠ কি আমাকে নতুন মূল্য দেওয়ার গ্যারান্টিযুক্ত? দস্তাবেজগুলি বলছে যে আপনার প্রয়োগের () প্রয়োগের পরে যদি অন্য কোন কমিট () ঘটে থাকে, তবে কমিট () প্রয়োগ হবে () ডিস্কে লাগানো অবধি অবরুদ্ধ হবে, যা স্পষ্ট করে দেয় যে 'লেখার' কাজটি করার সময় এই সমস্যাটি ঘটে না , তবে আপনি যদি লেখেন এবং সঙ্গে সঙ্গে পড়ছেন তবে কি হবে? আমার পরীক্ষাগুলি থেকে, সর্বাধিক মানটি ফিরে আসে তবে আমি এটি 100% গ্যারান্টিযুক্ত কিনা তা জানতে চাই।
টিয়াগো


221

TL; ড:

  • commit()ডেটা সিঙ্ক্রোনালি লিখেছেন (থ্রেডটিকে এটি থেকে আটকানো ব্লক করা)। এটি আপনাকে অপারেশনের সাফল্য সম্পর্কে অবহিত করে।
  • apply()তাত্পর্যপূর্ণভাবে লেখার জন্য ডেটা শিডিউল করে । এটি আপনাকে অপারেশনের সাফল্য সম্পর্কে অবহিত করে না
  • আপনি যদি কোনও getX- পদ্ধতির মাধ্যমে সংরক্ষণ apply()এবং অবিলম্বে পড়েন তবে নতুন মানটি ফিরে আসবে!
  • যদি আপনি apply()কোনও পর্যায়ে কল করেছেন এবং এটি এখনও কার্যকর হচ্ছে, commit()অতীতের সমস্ত প্রয়োগকৃত কলগুলি এবং বর্তমান কমিট কলটি শেষ না হওয়া পর্যন্ত যে কোনও কল বন্ধ হবে ।

SharedPreferences.Editor ডকুমেন্টেশন থেকে আরও গভীরতর তথ্য :

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

যেহেতু SharedPreferences উদাহরণগুলি কোনও প্রক্রিয়াটির মধ্যে একক হিসাবে থাকে, যদি আপনি ইতিমধ্যে ফেরতের মানটিকে উপেক্ষা করে থাকেন তবে প্রয়োগ () এর সাথে প্রতিশ্রুতিবদ্ধ কোনও উদাহরণ প্রতিস্থাপন করা নিরাপদ।

SharedPreferences.Editor ইন্টারফেসটি সরাসরি প্রয়োগ করা হবে বলে আশা করা যায় না। তবে আপনি যদি পূর্বে এটি প্রয়োগ করে থাকেন এবং এখন প্রয়োগ () অনুপস্থিত সম্পর্কে ত্রুটি পেতে থাকেন তবে আপনি কেবল প্রয়োগ () থেকে কমিট () কল করতে পারেন।


19
এটি একটি আরও উত্তম উত্তর, যেহেতু এটি উল্লেখ করেছে যে apply()অ্যাসিনক্রোনাস এবং মুলতুবি লিখে রাখে ভবিষ্যতের কলগুলিকে ব্লক করে commit()
spaaarky21

22

প্রয়োগ () পরিবর্তে কমিট () ব্যবহার করে আমি কিছু সমস্যা অনুভব করছি। অন্যান্য প্রতিক্রিয়াগুলির পূর্বে যেমনটি বলা হয়েছে, প্রয়োগ () হ'ল অ্যাসিনক্রোনাস। আমি সমস্যাটি পেয়ে যাচ্ছি যে "স্ট্রিং সেট" পছন্দটিতে পরিবর্তিত পরিবর্তনগুলি অবিচ্ছিন্ন মেমোরিতে কখনও লেখা হয় না।

এটি যদি আপনি প্রোগ্রামটির "জোরপূর্বক আটকে রাখা" বা রমটিতে আমি আমার ডিভাইসে অ্যান্ড্রয়েড 4.1 দিয়ে ইনস্টল করে থাকি, যখন প্রক্রিয়াটি মেমরির প্রয়োজনীয়তার কারণে সিস্টেমের দ্বারা নিহত হয়।

আপনি যদি আপনার পছন্দগুলি জীবিত রাখতে চান তবে আমি "প্রয়োগ ()" পরিবর্তে "প্রয়োগ ()" ব্যবহার করার পরামর্শ দিচ্ছি।


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

সংক্রান্ত স্ট্রিং সেট, stackoverflow.com/questions/16820252/...
Tapirboy

@ জোসএলসিগুরা - ডক্সটি অন্যথায় পরামর্শ দেয়: " বিকাশকারী.অ্যান্ড্রয়েড. com/intl/ja/references/android/content/… " আপনার অ্যান্ড্রয়েড উপাদান লাইফসাইকেলগুলি এবং ডিস্কে প্রয়োগ () লেখার সাথে তাদের মিথস্ক্রিয়া সম্পর্কে চিন্তা করার দরকার নেই। কাঠামো স্থিতিস্থানে স্যুইচ করার আগে ফ্লাইট ডিস্ক প্রয়োগ () সম্পূর্ণ থেকে লেখার বিষয়টি নিশ্চিত করে। " আমি ভাবছি যে আপনি যা দেখছেন তা অ্যান্ড্রয়েডের একটি বাগ এবং এটি যদি নতুন সংস্করণে স্থির করা হয়েছে কিনা।
টুলমেকারস্টেভ

খুব একই সমস্যাটি আমার অ্যাপ্লিকেশনটিকে পুনরায় সেট করতে "প্রসেসফিনিক্স" লাইব্রেরিটি ব্যবহার করে আমার কাছে ধাবমান। আমি পুনরায় সেট করার ঠিক আগে একটি পছন্দ সংরক্ষণ করছিলাম এবং "প্রয়োগ" কাজ করছে না।
এলায়ান্টে

14

প্রয়োগ করুন ()।

এটি তত্ক্ষণাত্ র‍্যামে পরিবর্তনগুলি লিখে এবং অপেক্ষা করে এবং এটি অভ্যন্তরীণ স্টোরেজে (প্রকৃত পছন্দ ফাইলটি) পরে লিখে writes কমিট পরিবর্তনগুলি সিঙ্ক্রোনসিভ করে এবং সরাসরি ফাইলে লেখেন।


14
  • commit()সমকালীন হয়, apply()অ্যাসিনক্রোনাস হয়

  • apply() অকার্যকর ফাংশন।

  • commit() যদি নতুন মানগুলি অবিরাম স্টোরেজে সফলভাবে লেখা থাকে তবে সত্যটি প্রত্যাবর্তন হয়।

  • apply() রাষ্ট্রগুলি স্যুইচিংয়ের আগে সম্পূর্ণ গ্যারান্টি দেয়, আপনার অ্যান্ড্রয়েড উপাদান লাইফসাইকেলের বিষয়ে চিন্তা করার দরকার নেই

আপনি যদি মূল থ্রেড থেকে ফিরে আসা মানটি ব্যবহার না করেন commit()এবং পরিবর্তে commit()ব্যবহার apply()করুন commit()


13

দস্তাবেজগুলি apply()এবং commit():

বিপরীতে commit(), যা স্থায়ীভাবে স্টোরেজ স্থির করে রাখার জন্য তার পছন্দগুলি লিখে দেয়, তত্ক্ষণাত্ apply()মেমোরিতে তার পরিবর্তনগুলি SharedPreferencesপ্রতিশ্রুতি দেয় তবে ডিস্কে একটি অ্যাসিনক্রোনাস কমিট শুরু করে এবং আপনাকে কোনও ব্যর্থতার বিষয়ে অবহিত করা হবে না। যদি এই বিষয়ে অন্য কোনও সম্পাদক SharedPreferencesনিয়মিতভাবে কাজ করে থাকে commit()যখন apply()এখনও বকেয়া থাকে, commit()সমস্ত অ্যাসিঙ্ক কমিটি সম্পাদন না করে এবং প্রতিশ্রুতিবদ্ধ না হওয়া পর্যন্ত উইলটি ব্লক হয়ে যাবে। SharedPreferencesউদাহরণগুলি প্রক্রিয়াটির মধ্যে একক হিসাবে , যদি আপনি ইতিমধ্যে ফেরতের মানটিকে অগ্রাহ্য commit()করছেন apply()তবে এর কোনও উদাহরণ প্রতিস্থাপন করা নিরাপদ ।


6

জাভাডোক থেকে:

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


1

কমিট () এবং প্রয়োগ () এর মধ্যে পার্থক্য

আমরা যখন SharedPreferences ব্যবহার করছি তখন আমরা সেই দুটি পদ দ্বারা বিভ্রান্ত হতে পারি। মূলত এগুলি সম্ভবত একই, সুতরাং আসুন প্রতিশ্রুতি () প্রয়োগ করার পার্থক্যগুলি পরিষ্কার করুন এবং প্রয়োগ করুন ()।

1. রিটার্ন মান:

apply()সাফল্য বা ব্যর্থতার ইঙ্গিত দিয়ে কোনও বুলিয়ান না ফেরৎ প্রতিশ্রুতি দেয়। commit() যদি সংরক্ষণের কাজ করে তবে তা সত্য, অন্যথায় মিথ্যা।

  1. দ্রুততা:

apply()দ্রুততর. commit()ধীর।

  1. অ্যাসিঙ্ক্রোনাস বনাম সিঙ্ক্রোনাস:

apply(): অ্যাসিনক্রোনাস commit(): সিঙ্ক্রোনাস

  1. পরমাণু:

apply(): পারমাণবিক commit(): পরমাণু

  1. ত্রুটি বিজ্ঞপ্তি:

apply(): না commit(): হ্যাঁ


apply()"দ্রুত" তুলনায় কীভাবে commit()? তারা মূলত একই কাজটি উপস্থাপন করে যা থ্রেডের লুপারে রাখা হবে। ব্যাকগ্রাউন্ডে নেওয়ার commit()সময় সেই টাস্কটি apply()মূল লুপারে রাখে এবং এর ফলে মূল লুপটিকে ডিস্ক I / O টাস্কমুক্ত রাখে।
তাসির

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