ডেটা অবিরাম রাখতে অ্যান্ড্রয়েড অ্যাপ্লিকেশন ক্লাস ব্যবহার করা


112

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


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

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

উত্তর:


134

আমি মনে করি না 500 কেবি এত বড় একটি চুক্তি হবে।

আপনি যা বর্ণনা করেছেন তা হ'ল আমি কীভাবে কোনও ক্রিয়াকলাপে ডেটা হারানোর সমস্যাটি সমাধান করেছি। আমি অ্যাপ্লিকেশন ক্লাসে একটি গ্লোবাল সিঙ্গলটন তৈরি করেছি এবং আমি ব্যবহৃত ক্রিয়াকলাপ থেকে এটি অ্যাক্সেস করতে সক্ষম হয়েছি।

আপনি যদি গ্লোবাল সিঙ্গেলনে প্রচুর পরিমাণে ব্যবহার করতে চলেছেন তবে আপনি চারপাশে ডেটা পাস করতে পারেন।

public class YourApplication extends Application 
{     
     public SomeDataClass data = new SomeDataClass();
}

তারপরে যেকোন ক্রিয়াকলাপে এটি কল করুন:

YourApplication appState = ((YourApplication)this.getApplication());
appState.data.UseAGetterOrSetterHere(); // Do whatever you need to with the data here.

আমি এখানে আমার ব্লগ পোস্টে "গ্লোবাল সিঙ্গলটন" বিভাগের অধীনে এটি নিয়ে আলোচনা করেছি ।


1
দুর্ভাগ্যক্রমে প্রশ্নে থাকা ব্লগ পোস্টটি আর সেই ঠিকানায় পাওয়া যায় না।
মাইকবাবকক 1

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

1
আমি জানি এটি একটি পুরানো পোস্ট তবে আমি কেবল একটি সমস্যার মুখোমুখি হয়েছি যা এটি সমাধান করতে পারে, তবে এই শ্রেণিটি কোনওভাবে ম্যানিফেস্টে ঘোষণা করা দরকার, না? আমি ক্লাসটি অ্যাকসেস করতে পারি না তাই মনে হচ্ছে এটিই আমার অনুপস্থিত ...
জিভ কেস্টেন

1
@ জিভকেস্টেন ম্যানিফেস্টের ভিতরে অ্যাপ্লিকেশন ট্যাগে নাম = বৈশিষ্ট্য যুক্ত করার বিষয়ে কীভাবে?
মাইকিসি

@ এমজিসি আপনাকে ধন্যবাদ জানাল যে এটি কিছুক্ষণ হয়েছে, এবং হ্যাঁ আমি শেষ পর্যন্ত এটির কাজটিও করেছি, আমি এই ক্লাসে একটি কাস্ট দিয়ে গিটার অ্যাপ্লিকেশন কনটেক্সট () দিয়ে যেখানেই প্রয়োজন সেখানে এই ক্লাসের উদাহরণ তৈরি করেছি
জিভ কেস্টেন

57

Applicationউদাহরণস্বরূপ যারা গণনা করেন তারা ভুল। প্রথমদিকে, মনে হতে পারে Applicationযতক্ষণ না পুরো অ্যাপ প্রক্রিয়াটি বিদ্যমান থাকে ততক্ষণ এটি বিদ্যমান কিন্তু এটি একটি ভুল অনুমান।

ওএস প্রয়োজনীয় হিসাবে প্রক্রিয়াগুলি মেরে ফেলতে পারে। সমস্ত প্রক্রিয়া ডকটিতে নির্দিষ্ট "কিলিয়েবিলিটি" এর 5 স্তরে বিভক্ত ।

সুতরাং, উদাহরণস্বরূপ, যদি আপনার অ্যাপ্লিকেশন কোনও আগমনকারী কলটির উত্তর দেওয়ার কারণে ব্যাকগ্রাউন্ডে চলে যায়, তবে র‌্যামের অবস্থার উপর নির্ভর করে ওএস আপনার প্রক্রিয়াটিকে (বা না পারে) হত্যা করতে পারে (প্রক্রিয়াটির Applicationউদাহরণটি ধ্বংস করে ) ।

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

হালনাগাদ:

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


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

14
এটি প্রযোজনায় আমাদের জন্য একটি অপ্রয়োজনীয় চমক ছিল। বিশ্বাস করুন অ্যান্ড্রয়েড প্রক্রিয়াগুলিকে হত্যা করে, এটি কেবলমাত্র র্যামের অবস্থা এবং ডকুমেন্টেশনে বর্ণিত অন্যান্য কারণের উপর নির্ভর করে। এটি আমাদের জন্য দুঃস্বপ্ন ছিল তাই আমি কেবল আমার আসল অভিজ্ঞতাটি ভাগ করে নিই। ভাল আমরা এমুলেটরগুলিতে এটি করিনি, তবে বাস্তব বিশ্বে কিছু ডিভাইস অ্যাপ্লিকেশনগুলির সাথে 'ওভারলোড' করা হয়, সুতরাং একটি পটভূমি প্রক্রিয়া হত্যার একটি সাধারণ পরিস্থিতি। হ্যাঁ, যদি ব্যবহারকারী তারপরে অ্যাপ্লিকেশনটিকে অগ্রভূমিতে নিয়ে যাওয়ার সিদ্ধান্ত নেন - ওএস Applicationউদাহরণ সহ এই স্ট্যাকটি পুনরুদ্ধার করে , তবে আপনি যদি স্থির না হন তবে আপনার স্থির ডেটা থাকবে না unless
ভিট খুডেনকো

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

1
@ অর্হিত আপনি নিজের উত্তরটি খুব সাধারণীকরণ করছেন। এবং আপনার অনুমানের উপর ভিত্তি করে একটি সংকীর্ণ পদ্ধতির পরামর্শ দেওয়া। মিথ্যা অনুমান: স্ট্যাটিক ভেরিয়েবলগুলিতে থাকা ডেটা অ্যাপ্লিকেশনটির অধিবেশনগুলি ধরে রাখা দরকার। এমন অনেক ব্যবহারের ক্ষেত্রেও হতে পারে যেখানে ডেটা তুচ্ছ এবং তাত্ক্ষণিকভাবে চালিয়ে নেওয়া দরকার না।
মান্দার লিমিয়ে

2
আমার কাছে জটিল কাঠামোযুক্ত প্রায় 1 এমবি ডেটা রয়েছে। ডিভাইস কাজের সাথে ওভারলোড হয়ে গেলে সিরিয়ালাইজ / ডিসরিয়ালাইজ করতে আমার ২-৩ সেকেন্ড পর্যন্ত ব্যয় করতে পারে। ক্রিয়াকলাপগুলির মধ্যে সঞ্চয় / লোড সংরক্ষণের আইডিয়াটির জন্য খুব বেশি সময় ব্যয় হয়। আমি স্টোরেজ হিসাবে অ্যাপ্লিকেশন ব্যবহার। অবশ্যই অ্যাপ্লিকেশন উদাহরণস্বরূপ সঞ্চিত আমার ডেটা ক্লাসে প্রতিটি মেডোড যাচাই করা আছে - ডেটা এখনও বেঁচে আছে বা লোড করতে হবে। সুতরাং ডেভের এগুলি করতে হবে: 1. লোড / সেভ ফিনিক্স প্রদান করুন 2. অ্যাপ্লিকেশনটিতে ডেটা রাখুন। ৩. ডেটা অ্যাক্সেস করার জন্য ট্রিপল চেক যুক্তি।
কোস্তাদিন

6

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

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

public class ApplicationController extends Application {
    private static ApplicationController _appCtrl;

    public static ApplicationController getAppCtrl()
    {
         return _appCtrl;
    }
}

যেহেতু সাবক্লাসগুলি Applicationরিসোর্সগুলিও অর্জন করতে পারে, আপনি কোনও স্ট্যাটিক পদ্ধতি সংজ্ঞায়িত করার সময় কেবল এগুলি অ্যাক্সেস করতে পারতেন, যা এগুলি প্রদান করে, যেমন:

public static Resources getAppResources()
{
    return _appCtrl.getResources();
}

তবে মেমরি ফাঁস এড়াতে কনটেক্সট রেফারেন্সগুলির কাছাকাছি যাওয়ার সময় খুব সাবধান হন ।


6
আপনি নোট করতে ভুলে গেছেন যে আপনার অবশ্যই অ্যান্ড্রয়েড যুক্ত করতে হবে: নাম = "Application অ্যাপ্লিকেশন কনট্রোলার" এক্সএমএল ক্লাসটি ইনস্ট্যান্ট করার জন্য আপনার ম্যানিফেস্টে অ্যাপ্লিকেশন ট্যাগটি বৈশিষ্ট্যযুক্ত।
Egie5

এটি করার জন্য Applicationআপনাকে আসলে প্রসারিত করার দরকার নেই। এটি করার জন্য আপনি যে কোনও শ্রেণিতে স্থির সদস্যের পরিবর্তনশীল ঘোষণা করতে পারেন ।
ডেভিড ওয়াসার

2

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


পার্সেলগুলিতে ডেটা সংরক্ষণ করার জন্য যদি সত্যিই বড় হয় তবে কী হবে? এটিই হচ্ছে যা: অ্যান্ড্রয়েড.ওস ট্রানজেকশন টু লার্জএক্সেপশন: ডেটা পার্সেল সাইজ 838396 বাইট
অর্জুন ইসার

1

আপনার ক্রিয়াকলাপটি ধ্বংস এবং পুনরায় তৈরি করা হয়নি তা নিশ্চিত করতে আপনি অবশ্যই ওরিয়েন্টেশন কার্যকারিতা ওভাররাইড করতে পারেন। দেখুন এখানে


16
আপনি অনেক কিছু করতে পারেন। এর অর্থ এই নয় যে তারা ভাল ধারণা। এটি একটি ভাল ধারণা নয়।
অ্যান্ড্রু

আপনার অ্যাপ্লিকেশনটি অ্যান্ড্রয়েড যা করায় তা অনুমান করে তা নিশ্চিত করার জন্য স্ক্রিন ওরিয়েন্টেশন পরিবর্তন করে পরীক্ষা করা সহজতম উপায়।
18446744073709551615

0

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


0

আমি জানি এটি খুব পুরানো প্রশ্ন তবে জেটপ্যাক উপাদানগুলি থেকে ভিউমোডেল ব্যবহার করা ক্রিয়াকলাপ ঘোরার মধ্যে ডেটা সংরক্ষণের সেরা উপায়।

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

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