ফ্র্যাগমেন্টের সেট রিটেনইনস্ট্যান্স (বুলিয়ান) বোঝা


341

ডকুমেন্টেশন দিয়ে শুরু:

পাবলিক অকার্যকর সেট রিটেনইনস্ট্যান্স (বুলিয়ান ধরে রাখা)

ক্রিয়াকলাপ পুনরায় তৈরিকরণ (যেমন একটি কনফিগারেশন পরিবর্তন থেকে) জুড়ে কোনও খণ্ডের উদাহরণ ধরে রাখা আছে কিনা তা নিয়ন্ত্রণ করুন। এটি কেবল পিছনের স্ট্যাকের মধ্যে না দিয়ে টুকরো টুকরো ব্যবহার করা যেতে পারে। যদি সেট করা থাকে তবে কোনও ক্রিয়াকলাপটি পুনরায় তৈরি করা হলে খণ্ডের জীবনচক্রটি কিছুটা আলাদা হবে:

  • onDestroy () বলা হবে না (তবে onDetach () এখনও থাকবে, কারণ খণ্ডটি তার বর্তমান ক্রিয়াকলাপ থেকে আলাদা করা হচ্ছে)।
  • যেহেতু খণ্ডটি পুনরায় তৈরি হচ্ছে না তাই অনক্রিট (বান্ডিল) কল করা হবে না।
  • onAttach (ক্রিয়াকলাপ) এবং onActivityCreated (বান্ডেল) এখনও কল করা হবে।

আমার কিছু প্রশ্ন আছে:

  • খণ্ডটি কী তার দৃষ্টিভঙ্গি ধরে রাখে, বা কনফিগারেশন পরিবর্তনে এটি পুনরায় তৈরি করা হবে? "ধরে রাখা" মানে কি?

  • ব্যবহারকারী ক্রিয়াকলাপটি ছেড়ে দিলে খণ্ডটি কি ধ্বংস হয়ে যাবে?

  • এটি পিছনের স্ট্যাকের টুকরো দিয়ে কেন কাজ করে না?

  • কোনটি ব্যবহারের ক্ষেত্রে এই পদ্ধতিটি ব্যবহার করে বোঝা যায়?


উত্তর:


348

প্রথমত, রক্ষিত টুকরোগুলিতে আমার পোস্টটি দেখুন । এটি সাহায্য করতে পারে।

এখন আপনার প্রশ্নের উত্তর দিতে:

টুকরা তার ধরে রাখা যায় দৃশ্য রাজ্য অথবা এই কনফিগারেশন পরিবর্তন recreated করা হবে - কি ঠিক হল "অপরিবর্তিত রাখা"?

হ্যাঁ, Fragmentকনফিগারেশন পরিবর্তন জুড়ে এর রাজ্য ধরে রাখা হবে। বিশেষত, "ধরে রাখা" এর অর্থ হ'ল কনফিগারেশনের পরিবর্তনের ফলে খণ্ডটি বিনষ্ট হবে না । অর্থাৎ Fragmentকরা হবে অপরিবর্তিত রাখা এমনকি যদি কনফিগারেশন পরিবর্তন অন্তর্নিহিত কারণ Activityধ্বংস হয়ে যাবে।

ব্যবহারকারী ক্রিয়াকলাপটি ছেড়ে দিলে খণ্ডটি কি ধ্বংস হয়ে যাবে?

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

এটি পিছনের স্ট্যাকের টুকরো দিয়ে কেন কাজ করে না?

বোধহয় কেন এটা সমর্থন করে না এর একাধিক কারণ আছে, কিন্তু আমার কাছে সবচেয়ে সুস্পষ্ট কারণ যে Activityএকটি রেফারেন্স ঝুলিতে FragmentManager, এবং FragmentManagerbackstack পরিচালনা করে। এটি হ'ল, যদি আপনি নিজের অবস্থান ধরে রাখতে চান Fragmentবা না করেন তবে কনফিগারেশনের পরিবর্তনে Activity(এবং এইভাবেই FragmentManagerএর পিছনের দিক) ধ্বংস হয়ে যাবে। অন্য কারণ কেন এটিকে কাজ নাও করতে পারে কারণ কিছু বিভ্রান্তিকর হতে পারে উভয় অপরিবর্তিত রাখা টুকরা এবং অ অপরিবর্তিত রাখা টুকরা একই backstack উপস্থিত করার অনুমতি দেওয়া হয়েছে।

কোনটি ব্যবহারের ক্ষেত্রে এই পদ্ধতিটি ব্যবহার করে বোঝা যায়?

পুনরায় টুকরো টুকরো করা ক্রিয়াকলাপের দৃষ্টান্ত জুড়ে রাষ্ট্রের তথ্য - বিশেষত থ্রেড ম্যানেজমেন্টের প্রচারের জন্য বেশ কার্যকর হতে পারে। উদাহরণস্বরূপ, কোনও খণ্ডটি এর ক্রিয়াকলাপ পরিচালনা করে Threadবা এর উদাহরণ হিসাবে হোস্ট হিসাবে পরিবেশন করতে পারে AsyncTask। দেখুন আমার ব্লগ পোস্ট আরো তথ্যের জন্য এই বিষয়ে।

সাধারণভাবে, আমি এটির onConfigurationChangedসাথে Activityএটি ব্যবহার করার মতোই ব্যবহার করব ... এটি কোনও বানডাইড হিসাবে ব্যবহার করবেন না কারণ আপনি কোনও ওরিয়েন্টেশন পরিবর্তন সঠিকভাবে প্রয়োগ / পরিচালনা করতে খুব অলস are আপনার প্রয়োজন হলে এটি ব্যবহার করুন।


37
দেখুন অবজেক্টগুলি ধরে রাখা হয় না, এগুলি সর্বদা কনফিগারেশনের পরিবর্তনে ধ্বংস হয়।
মার্কাস জাঙ্গিঙ্গার

103
যতদুর আমি বলতে যেমন করতে পারেন আছে যদি setRetainInstance(true), Fragmentজাভা বস্তু, এবং এর সমস্ত সামগ্রী করছে না ঘূর্ণন ধ্বংস, কিন্তু দৃশ্য হয় recreated। অর্থাৎ onCreatedView()আবার বলা হয়। Activitiesঅ্যান্ড্রয়েড ১.০ থেকে এটি যেভাবে কাজ করা উচিত ছিল এটি মূলত । আমি এটি ব্যবহার করা "অলস" বলে মনে করি না, বা এটি ব্যবহার করা "যথাযথ" নয়। আসলে আমি এটি দেখতে পাচ্ছি না কেন এটি ডিফল্ট নয়, বা আপনি কেন এটি বন্ধ চান।
টিমম্মে

24
"আপনার পিছনের স্ট্যাকের টুকরো টুকরো দিয়ে কেন এটি কাজ করে না?" বুঝতে কঠিন. তবে সম্ভবত আমি বোবা :(
এইচজিপিবি

13
@ ডিয়ের একটি ক্রিয়াকলাপ বিভিন্ন উপায়ে ধ্বংস হতে পারে। উদাহরণস্বরূপ, আপনি যদি "পিছনে" ক্লিক করেন তবে ক্রিয়াকলাপটি নষ্ট হয়ে যাবে। আপনি যদি "হোম" ক্লিক করেন, ক্রিয়াকলাপ বন্ধ হয়ে যাবে এবং স্মৃতিশক্তি কম থাকলে ভবিষ্যতে কোনও সময় ধ্বংস হতে পারে। পুনরুদ্ধারকারীগুলি Fragmentকেবলমাত্র কনফিগারেশনের পরিবর্তনগুলি ধরে রাখা যায়, যেখানে অন্তর্নিহিত ক্রিয়াকলাপটি ধ্বংস এবং তত্ক্ষণাত পুনরায় তৈরি করা যায়। অন্যান্য সমস্ত ক্ষেত্রে যে ক্রিয়াকলাপটি ধ্বংস হয়ে যায়, রক্ষিত খণ্ডগুলিও ধ্বংস হয়ে যাবে।
অ্যালেক্স লকউড

3
@AlexLockwood আপনি নিম্নলিখিত দয়া করে নিশ্চিত করুন করতে পারেন: যদিও setRetainInstance(true)ব্যবহার করা হয়, এক এখনও রয়েছে তাদের নিজস্ব অধ্যবসায় (বাস্তবায়ন savedInstanceStateবা অন্যথায়) সমস্ত পরিস্থিতিতে হ্যান্ডেল পাবে: যেমন "বাড়িতে কী, ঘোরান, ফিরে অ্যাপ্লিকেশানে" কন্সট্রাকটর সঙ্গে আমার টুকরা recreates কল, সমস্ত রাষ্ট্র ভেরিয়েবল হারাতে। আমার একটি AsyncTaskসদস্য ভেরিয়েবল আছে, এজন্য আমি এখন ধরে রাখতে চাই, এখন যদি আমি এটি কাজ করতে চাই তবে আমাকে বাধ্য হয়ে কাজটি বন্ধ করতে, রাষ্ট্রকে বাঁচাতে এবং ব্যবহারকারী ফিরে এলে পুনরায় শুরু করতে বাধ্য হয়। সুতরাং সর্বোপরি, রোটেশনটি সহায়তা করার এটি কেবল একটি দ্রুত উপায়, তবে অন্যথায় সাধারণভাবে অকেজো।
TWiStErRob

28

setRetaininstanceactivityকনফিগারেশনের পরিবর্তনের কারণে যখন আপনার ধ্বংস এবং পুনরায় তৈরি করা হয় কেবল তখনই কার্যকর কারণ কলগুলির সময় দৃষ্টান্তগুলি সংরক্ষণ করা হয় onRetainNonConfigurationInstance। এটি হ'ল, আপনি যদি ডিভাইসটি ঘোরান, তবে টুকরো টুকরো টুকরো থাকবে (সেগুলি ধ্বংস এবং পুনরায় তৈরি করা হবে না but) তবে রানটাইম যখন সম্পদ পুনর্বিবেচনার জন্য কার্যকলাপটিকে হত্যা করে, তখন কিছুই অবশিষ্ট থাকে না nothing আপনি যখন পিছনে বোতাম টিপুন এবং ক্রিয়াকলাপটি প্রস্থান করেন, তখন সমস্ত কিছু ধ্বংস হয়ে যায়।

সময় পরিবর্তনের সময় পরিবর্তনের জন্য আমি এই ফাংশনটি ব্যবহার করি ayকেন আমি সার্ভার থেকে বিটম্যাপের একটি গুচ্ছ ডাউনলোড করেছি এবং প্রত্যেকে 1 এমবি, যখন ব্যবহারকারী দুর্ঘটনাক্রমে তার ডিভাইসটি ঘোরান, আমি অবশ্যই সমস্ত ডাউনলোডের কাজটি আর করতে চাই না o তাই আমি Fragmentআমার বিটম্যাপগুলি একটি হোল্ডিং তৈরি করি এবং এটি ম্যানেজার এবং কলটিতে যুক্ত করি setRetainInstance, স্ক্রিনের ওরিয়েন্টেশন পরিবর্তন হলেও সমস্ত বিটম্যাপগুলি এখনও রয়েছে।


আপনি কি কেবলমাত্র বিটম্যাপের জন্য ধারক হিসাবে "কেবলমাত্র ডেটা-কেবল" টুকরোগুলি তৈরি করেন (কোনও উইজেট ছাড়াই) বা সেই টুকরোগুলিতেও উইজেট থাকতে পারে? আমি
খণ্ডটিতে

কাঠামোটি mActivityআপনার জন্য রেফারেন্স সাফ করবে । তবে আমি জানি না যে রানটাইম এই ক্ষেত্রে টুকরো টুকরো ক্ষেত্রে উইজেটগুলি সাফ করবে কিনা। দয়া করে এটি ব্যবহার করে দেখুন বা উত্স কোডটিতে ডুব দিন।
সুতিয়ানশি

আমরা কখন রিটেইনইনস্ট্যান্সটি ব্যবহার করতে পারি তার দুর্দান্ত উদাহরণ
মু সা

12

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

এখানে অ্যান্ড্রয়েড ক্রিয়াকলাপ / খণ্ডের কিছু বিশ্লেষণ আশা করি এটি সহায়তা করে। http://ideaventure.blogspot.com.au/2014/01/android-activityfragment-life-cycle.html


8
স্ক্রিনটি ঘোরানোর সময় আমি অবশ্যই অনক্রিটভিউকে ধরে রাখা খণ্ডগুলিতে আবার কল করা দেখছি।
এআইজ

এই লিঙ্কটি কি আপনার নিজের ব্লগ? যদি বিষয়টি হয় তবে আপনার এটি পরিষ্কার করা উচিত।
ফ্লেক্সো

4

setRetainInstance () - অবচয়

টুকরো সংস্করণ হিসাবে 1.3.0-alpha01

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


2

আপনি যখন এমন কিছু উপাদান রাখতে চান যা ক্রিয়াকলাপের জীবনচক্রের সাথে বাঁধা না থাকে সেটেটটাইনইনস্ট্যান্স (বুলিয়ান) কার্যকর হয়। এই কৌশলটি উদাহরণস্বরূপ rxloader দ্বারা "rxjava এর পর্যবেক্ষনের জন্য অ্যান্ড্রয়েডের ক্রিয়াকলাপ লাইফেকাইল পরিচালনা করতে" ব্যবহার করা হয় (যা আমি এখানে পেয়েছি )।

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