ক্রিয়াকলাপগুলির মধ্যে ডেটা ভাগ করার সর্বোত্তম উপায় কী?


239

আমার একটি ক্রিয়াকলাপ রয়েছে যা অ্যাপ্লিকেশন জুড়ে মূল ক্রিয়াকলাপ এবং এটিতে বেশ কয়েকটি ভেরিয়েবল রয়েছে। আমার আরও দুটি ক্রিয়াকলাপ রয়েছে যা আমি প্রথম ক্রিয়াকলাপের ডেটা ব্যবহার করতে সক্ষম হতে চাই। এখন আমি জানি আমি এরকম কিছু করতে পারি:

GlobalState gs = (GlobalState) getApplication();
String s = gs.getTestMe();

তবে আমি প্রচুর ভেরিয়েবলগুলি ভাগ করতে চাই এবং কিছুগুলি এর চেয়ে বড় হতে পারে তাই উপরের মতো তাদের অনুলিপি তৈরি করতে চাই না।

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


2
অ্যান্ড্রয়েড ২.৩ (জিনজারব্রেড) হিসাবে, গেট / সেটটির অপ্টিমাইজেশন ডালভিক দ্বারা স্বয়ংক্রিয়ভাবে সম্পাদিত হয়; আপনি কেবল অ্যান্ড্রয়েডের পুরানো সংস্করণগুলি লক্ষ্য করে থাকলে এটি কেবল প্রাসঙ্গিক।
স্টার্লোরওয়ারটেক্স

নোট করুন যে উদাহরণটি স্ট্রিং ডেটা অনুলিপি করে না। বরং এটি একই স্ট্রিং অবজেক্টের একটি রেফারেন্স তৈরি করে।
কোড-শিক্ষানবিশ

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


লাইভডেটা হ'ল সেরা, সাম্প্রতিক সমাধান। আমার উত্তর নীচে পরীক্ষা করুন।
আমির উওয়াল

উত্তর:


476

এটি অর্জনের জন্য সর্বাধিক সাধারণ পদ্ধতির সংকলন :

  • অভিপ্রায়টির মধ্যে ডেটা প্রেরণ করুন
  • স্থির ক্ষেত্র
  • এর হ্যাশম্যাপ WeakReferences
  • অবজেক্ট অবজেক্টস (স্ক্লাইট, শেয়ারের পছন্দসমূহ, ফাইল ইত্যাদি)

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

প্রতিটি পদ্ধতির কীভাবে এবং কেন প্রয়োগ করা যায় তার কয়েকটি উদাহরণ:

ইন্টেন্টের ভিতরে ডেটা প্রেরণ করুন

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("some_key", value);
intent.putExtra("some_other_key", "a value");
startActivity(intent);

দ্বিতীয় ক্রিয়াকলাপে:

Bundle bundle = getIntent().getExtras();
int value = bundle.getInt("some_key");
String value2 = bundle.getString("some_other_key");

আপনি যদি প্রাথমিক তথ্য বা স্ট্রিংগুলি অতিক্রম করে থাকেন তবে এই পদ্ধতিটি ব্যবহার করুন । আপনি প্রয়োগকারী বস্তুগুলিও পাস করতে পারেন Serializable

প্রলুব্ধকর হলেও, ব্যবহারের আগে আপনার দু'বার চিন্তা করা উচিত Serializable: এটি ত্রুটিযুক্ত এবং ভয়াবহভাবে ধীরে ধীরে। সুতরাং সাধারণভাবে: সম্ভব হলে দূরে থাকুনSerializable । আপনি যদি জটিল ব্যবহারকারী-সংজ্ঞায়িত অবজেক্টগুলি পাস করতে চান তবে Parcelableইন্টারফেসটি একবার দেখুন । এটি কার্যকর করা আরও শক্ত, তবে এর তুলনায় এটির যথেষ্ট গতি লাভ রয়েছে Serializable

ডিস্কে স্থির না হয়ে ডেটা ভাগ করুন

ক্রিয়াকলাপের মধ্যে মেমোরিতে সংরক্ষণ করে ক্রিয়াকলাপগুলির মধ্যে ডেটা ভাগ করা সম্ভব যে বেশিরভাগ ক্ষেত্রে উভয় ক্রিয়াকলাপ একই প্রক্রিয়াতে চলে।

দ্রষ্টব্য: কখনও কখনও, যখন ব্যবহারকারী আপনার ক্রিয়াকলাপটি ছেড়ে দেয় (এটিকে ছাড়েন না), অ্যান্ড্রয়েড আপনার অ্যাপ্লিকেশনটি হত্যা করার সিদ্ধান্ত নিতে পারে। এই জাতীয় দৃশ্যে, আমি এমন কেসগুলির অভিজ্ঞতা পেয়েছি যার মধ্যে অ্যান্ড্রয়েড অ্যাপটি মারা যাওয়ার আগে সরবরাহ করা অভিপ্রায় ব্যবহার করে শেষ ক্রিয়াকলাপটি চালু করার চেষ্টা করে। এই ক্ষেত্রে, একক সিলেটে থাকা ডেটা (আপনার বা আপনার হয় Application) চলে যাবে এবং খারাপ কিছু ঘটতে পারে। এই জাতীয় ঘটনা এড়াতে, আপনি হয় ডিস্কে অবজেক্টগুলি অবিরত রাখুন বা এর বৈধতা নিশ্চিত করার জন্য এটি ব্যবহারের আগে ডেটা পরীক্ষা করুন।

একটি সিঙ্গলটন ক্লাস ব্যবহার করুন

ডেটা ধরে রাখতে একটি ক্লাস করুন:

public class DataHolder {
  private String data;
  public String getData() {return data;}
  public void setData(String data) {this.data = data;}

  private static final DataHolder holder = new DataHolder();
  public static DataHolder getInstance() {return holder;}
}

চালু হওয়া কার্যকলাপ থেকে:

String data = DataHolder.getInstance().getData();

অ্যাপ্লিকেশন একক ব্যবহার করুন

android.app.Applicationঅ্যাপ্লিকেশন লঞ্চ করার সময় অ্যাপ্লিকেশন সিঙ্গলটন একটি উদাহরণ যা তৈরি হয়। আপনি বাড়িয়ে একটি কাস্টম সরবরাহ করতে পারেন Application:

import android.app.Application;
public class MyApplication extends Application {
  private String data;
  public String getData() {return data;}
  public void setData(String data) {this.data = data;}
}

ক্রিয়াকলাপটি চালু করার আগে:

MyApplication app = (MyApplication) getApplicationContext();
app.setData(someData);

তারপরে, চালু করা কার্যকলাপ থেকে:

MyApplication app = (MyApplication) getApplicationContext();
String data = app.getData();

স্থির ক্ষেত্র

ধারণাটি মূলত সিঙ্গলটনের মতোই, তবে এক্ষেত্রে আপনি ডেটাটিতে স্থির অ্যাক্সেস সরবরাহ করেন:

public class DataHolder {
  private static String data;
  public static String getData() {return data;}
  public static void setData(String data) {DataHolder.data = data;}
}

চালু হওয়া কার্যকলাপ থেকে:

String data = DataHolder.getData();

এর হ্যাশম্যাপ WeakReferences

একই ধারণা, তবে আবর্জনা সংগ্রহকারীকে অবাস্তবহীন বস্তুগুলি সরানোর অনুমতি দেয় (উদাহরণস্বরূপ যখন ব্যবহারকারী ক্রিয়াকলাপটি ত্যাগ করেন):

public class DataHolder {
  Map<String, WeakReference<Object>> data = new HashMap<String, WeakReference<Object>>();

  void save(String id, Object object) {
    data.put(id, new WeakReference<Object>(object));
  }

  Object retrieve(String id) {
    WeakReference<Object> objectWeakReference = data.get(id);
    return objectWeakReference.get();
  }
}

ক্রিয়াকলাপটি চালু করার আগে:

DataHolder.getInstance().save(someId, someObject);

চালু হওয়া কার্যকলাপ থেকে:

DataHolder.getInstance().retrieve(someId);

অভিপ্রায়টির অতিরিক্ত ব্যবহার করে আপনাকে অবজেক্ট আইডি পাস করতে বা নাও করতে পারে। এটি সব আপনার নির্দিষ্ট সমস্যার উপর নির্ভর করে।

ডিস্কে অবজেক্টগুলি স্থির রাখুন

অন্যান্য ক্রিয়াকলাপটি চালু করার আগে ডিস্কে ডেটা সংরক্ষণ করার ধারণাটি।

সুবিধা: আপনি অন্যান্য স্থান থেকে ক্রিয়াকলাপটি চালু করতে পারেন এবং যদি ডেটা ইতিমধ্যে বজায় থাকে তবে এটি ঠিকঠাক কাজ করা উচিত।

অসুবিধাগুলি: এটি জটিল এবং বাস্তবায়নে আরও বেশি সময় নেয়। আরও কোড প্রয়োজন এবং এর ফলে ত্রুটিগুলি প্রবর্তনের আরও সম্ভাবনা রয়েছে। এটিও অনেক ধীর হবে।

অবজেক্টগুলি বজায় রাখার কয়েকটি উপায়ের মধ্যে রয়েছে:


11
আমি যুক্তি দিয়ে বলব যে বৃহত্তর / আরও জটিল ডেটার জন্য এটি "সাধারণ" উপায় নয়। স্ট্যাটিক সিঙ্গলটন বা অ্যাপ্লিকেশন অবজেক্টটি ব্যবহার করা অনেক সহজ এবং এটি দুর্দান্ত কাজ করে। এখন এটি বলেছে যে ওপি উদাহরণটিতে একটি স্ট্রিং ব্যবহার করেছে, তার জন্য, অভিপ্রায় নিখুঁত এবং পছন্দসই।
চার্লি কলিন্স

10
সিরিয়ালাইজেবল অ্যান্ড্রয়েড প্রক্রিয়া মডেলটিতে গুরুতর পারফরম্যান্স সমস্যা পেয়েছে। তারা কেন পার্সেবলকে পরিচয় করিয়ে দিয়েছে ts উপরের উত্তরে সিরিয়ালযোগ্যের পরিবর্তে পার্সেবল পড়ুন ।
সুবিন সেবাস্তিয়ান

3
যে setResultপদ্ধতি মাধ্যমে সম্পন্ন । এছাড়াও, সেক্ষেত্রে মাধ্যমিক ক্রিয়াকলাপটি startActivityForResultপদ্ধতিটি ব্যবহার করে আবেদন করতে হবে ।
ক্রিশ্চিয়ান

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

1
আমি অ্যাপ্লিকেশন ক্লাসে ডেটা সংরক্ষণের পরামর্শ দেব না। এখানে আরও পড়ুন: developerphil.com/dont-store-data-in-theapplication-object
শায়ান_আরয়ান

22

আপনি যা ব্যবহার করতে পারেন:

  1. কার্যক্রমের মধ্যে ডেটা পাসিং (যেমন ক্রিশ্চিয়ান বলেছেন)
  2. প্রচুর স্থিতিশীল ভেরিয়েবল সহ একটি ক্লাস ব্যবহার করে (যাতে আপনি ক্লাসের উদাহরণ ছাড়াই এবং গেটর / সেটার ব্যবহার না করে তাদের কল করতে পারেন)
  3. একটি ডাটাবেস ব্যবহার করে
  4. ভাগ করা পছন্দসমূহ

আপনি যা পছন্দ করেন তা আপনার প্রয়োজনের উপর নির্ভর করে। সম্ভবত যখন আপনি "প্রচুর" থাকবেন তখন আপনি একাধিক উপায় ব্যবহার করবেন


1
অনুগ্রহ করে নোট করুন যে প্রক্রিয়াজনিত মৃত্যুর পরে স্ট্যাটিকস সাফ হয়ে গেছে
এপিকপ্যান্ডফোর্স

অবশ্যই অ্যাপিকপান্ডা ফোরস এবং অবশ্যই যখন ডিভাইসটি বন্ধ ছিল।
ওয়ারেনফেইথ

1
তবে ডিভাইসটি বন্ধ করা থাকলে অ্যাপটি MAINক্রিয়াটি থেকে পুনরায় চালু হয় । প্রক্রিয়াজনিত মৃত্যুর পরে, আপনি গত যে কোনও ক্রিয়াকলাপটি খোলা ছিল তা আবার চালু করুন, যা অ্যাপ্লিকেশনটির আরও গভীর জায়গায় বিশদ পৃষ্ঠা হতে পারে।
এপিকপান্ডাফোরস

@ এপিকপান্ডা ফর্স মনে হচ্ছে আপনি সিপিটি স্পষ্ট হিসাবেও আমার বিড়ম্বনাটি মিস করেছেন।
ওয়ারেনফেইথ

16

গুগল আপনাকে যা করতে আদেশ করবে তা করুন! এখানে: http://developer.android.com/resources/faq/framework.html#3

  • আদিম তথ্য প্রকার
  • অবিচলিত অবজেক্টস
  • একক ক্লাস - আমার প্রিয়: ডি
  • একটি সর্বজনীন স্থির ক্ষেত্র / পদ্ধতি
  • অবজেক্টস অব উইক রেফারেন্সের হ্যাশম্যাপ
  • অবিচ্ছিন্ন অবজেক্টস (অ্যাপ্লিকেশন পছন্দসমূহ, ফাইলস, বিষয়বস্তু সরবরাহকারী, এসকিউএলাইট ডিবি)


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

লিঙ্কটি নষ্ট হয়েছে :(
শায়ান_আরিয়ান

14

"তবে আমি প্রচুর ভেরিয়েবলগুলি ভাগ করতে চাই এবং কিছুগুলি এর চেয়ে বড় হতে পারে তাই আমি উপরের মতো সেগুলির অনুলিপি তৈরি করতে চাই না।"

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

তবে আপনি যদি এটি না করতে চান, আপনি কেবল পরিবর্তনশীলগুলি সর্বজনীন বা গ্লোবালস্টেটে সুরক্ষিত করতে এবং সেগুলিতে সরাসরি অ্যাক্সেস করতে পারেন। অ্যাপ্লিকেশন অবজেক্ট জাভাডকের ইঙ্গিত হিসাবে আপনি একটি স্ট্যাটিক সিঙ্গলটন তৈরি করতে পারেন :

সাধারণত সাবক্লাস অ্যাপ্লিকেশন প্রয়োজন হয় না। বেশিরভাগ পরিস্থিতিতে স্থিতিশীল সিঙ্গেলটনগুলি আরও মডুলার পদ্ধতিতে একই কার্যকারিতা সরবরাহ করতে পারে। যদি আপনার সিঙ্গলটনের কোনও বৈশ্বিক প্রসঙ্গের প্রয়োজন হয় (উদাহরণস্বরূপ ব্রডকাস্ট রিসিভারগুলি নিবন্ধ করার জন্য), এটি পুনরুদ্ধার করার জন্য ফাংশনটি এমন একটি প্রবন্ধ দেওয়া যেতে পারে যা সিঙ্গলটন নির্মাণের সময় অভ্যন্তরীণভাবে Context.get ApplicationContext () ব্যবহার করে।

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

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


1
প্রকৃতপক্ষে, আমি সম্প্রতি ডক্সে এটিকে হোঁচট খেয়েছি: বিকাশকারী.অ্যান্ড্রয়েড . com/guide/appendix/faq/ framework.html#3 । "অ-অবিচলিত জটিল বস্তুগুলির" জন্য এটি স্ট্যাটিক সিঙ্গলটন তৈরি এবং ছিন্ন করতে অ্যাপ্লিকেশন ক্লাসটি ব্যবহার করার পরামর্শ দেয়! এইভাবে আপনি সু-সংজ্ঞায়িত লাইফসাইক্ল অ্যাপ্লিকেশন সরবরাহ করে এবং একটি স্ট্যাটিক সিঙ্গলটন ব্যবহারের সহজতা পান।
চার্লি কলিন্স

2
প্রায়শই জিজ্ঞাসিত অংশটি সরিয়ে ফেলা হয়েছে বলে মনে হচ্ছে (আমি কেবল "অ-স্থায়ী অবজেক্টস" দেখছি এবং অ্যাপ্লিকেশন শ্রেণির কোনও উল্লেখ নেই)। যাইহোক আপনি বিস্তারিত বলতে পারেন?
টনি চ্যান

1
এটি বর্তমানে বিকাশকারী.অ্যান্ড্রয়েড. com/guide/faq/ framework.html#3 এ রয়েছে "আমি কীভাবে একক অ্যাপ্লিকেশনের মধ্যে ক্রিয়াকলাপ / পরিষেবাগুলির মধ্যে ডেটা পাস করব?", এবং অ্যাপ্লিকেশন শ্রেণির কোনও উল্লেখ নেই।
জেরি 101

আপনি "অ্যান্ড্রয়েড ইন অ্যাকশন" এ স্থাপন করেছেন এমন নজির অনুসরণ করে আমি একটি অ্যাপ্লিকেশন অবজেক্টটি ব্যবহার করতে পছন্দ করি। কোড চ্যালেঞ্জগুলি যখন দেখেন তবে অনেক সম্ভাব্য নিয়োগকারীরা এটি পছন্দ করেন না। এগুলি ভুল হতে পারে তবে তারা তাদের ওজন ছড়িয়ে দেয়। বিটিডাব্লু: যে 'ফ্রেমওয়ার্ক। Html # 3 লিঙ্কটি আর কাজ করে না।
ম্যাট জে।

7

আপনি অ্যাপ্লিকেশন শ্রেণিটি প্রসারিত করতে পারেন এবং সেখানে যে কোনও বস্তু আপনি চান তা ট্যাগ করতে পারেন, সেগুলি তখন আপনার অ্যাপ্লিকেশনের যে কোনও জায়গায় পাওয়া যায়


আমি অ্যাপ্লিকেশন ক্লাসে ডেটা সংরক্ষণের পরামর্শ দেব না। এখানে আরও পড়ুন: developerphil.com/dont-store-data-in-theapplication-object
শায়ান_আরয়ান

4

ক্রিয়াকলাপগুলির মধ্যে ডেটা ভাগ করার জন্য একটি নতুন এবং আরও ভাল উপায় রয়েছে এবং এটি লাইভ ডেটা । বিশেষত অ্যান্ড্রয়েড বিকাশকারীর পৃষ্ঠা থেকে এই উদ্ধৃতিটি লক্ষ্য করুন:

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

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


2

উপরে বর্ণিত দুর্বল রেফারেন্স পদ্ধতির হ্যাশম্যাপ ব্যবহার করা এবং http://developer.android.com/guide/faq/framework.html এ আমার কাছে সমস্যা মনে হচ্ছে। পুরো মানচিত্রের মানচিত্রের মূল্য নয়, কীভাবে পুনরায় দাবি করা যেতে পারে? আপনি কোন সুযোগে এটি বরাদ্দ করেন? ক্রিয়াকলাপটি কার্যকলাপ ক্রিয়াকলাপের নিয়ন্ত্রণে থাকায়, অংশগ্রহনকারী ক্রিয়াকলাপগুলির মধ্যে একটির মালিকানা পেলে মালিক তার ক্লায়েন্টদের আগাম ধ্বংস হয়ে গেলে রানটাইম ত্রুটির ঝুঁকি নিয়ে থাকে। যদি অ্যাপ্লিকেশনটির মালিকানা থাকে তবে কিছু ক্রিয়াকলাপের স্পষ্টরূপে একটি বৈধ কী এবং কোনও সম্ভাব্য আবর্জনা সংগৃহীত দুর্বল রেফারেন্স সহ প্রবেশের মাধ্যমে হ্যাশম্যাপটি এড়াতে অবশ্যই এন্ট্রি সরিয়ে ফেলতে হবে। তদ্ব্যতীত, কোনও চাবির জন্য প্রত্যাবর্তিত মানটি শূন্য হলে কোনও ক্লায়েন্টকে কী করা উচিত?

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


2

ক্রিয়াকলাপের মধ্যে ডেটা ভাগ করার বিভিন্ন উপায় রয়েছে

1: ইনটেন্ট ব্যবহার করে ক্রিয়াকলাপের মধ্যে ডেটা পাস করা

Intent intent=new Intent(this, desirableActivity.class);
intent.putExtra("KEY", "Value");
startActivity(intent)

2: স্ট্যাটিক কীওয়ার্ড ব্যবহার করে ভেরিয়েবলটিকে পাবলিক স্ট্যাটিক হিসাবে সংজ্ঞায়িত করুন এবং যে কোনও প্রকল্পে ব্যবহার করুন

      public static int sInitialValue=0;

Classname.variableName ব্যবহার করে প্রকল্পের যে কোনও জায়গায় ব্যবহার করুন;

3: ডাটাবেস ব্যবহার

তবে এর বিট লম্বা প্রক্রিয়া, আপনার প্রয়োজন অনুসারে ডেটা সন্নিবেশ করার জন্য ক্যোয়ারী ব্যবহার করতে হবে এবং যখন প্রয়োজন হয় তখন কার্সর ব্যবহার করে ডেটা পুনরাবৃত্তি করতে হবে। তবে ক্যাশে পরিষ্কার না করে ডেটা হারানোর কোনও সম্ভাবনা নেই।

4: ভাগ করা পছন্দগুলি ব্যবহার করে

ডাটাবেস তুলনায় অনেক সহজ। তবে কিছু সীমাবদ্ধতা রয়েছে আপনি অ্যারেলিস্ট, তালিকা এবং গ্রাহক জিনিস সংরক্ষণ করতে পারবেন না।

5: অ্যাপ্লিকেশন ক্লাসে গেটর সেটার তৈরি করুন এবং প্রকল্পে যেখানেই অ্যাক্সেস করুন।

      private String data;
      public String getData() {
          return data;
      }

      public void setData(String data) {
          this.data = data;
      }

এখানে সেট এবং ক্রিয়াকলাপ থেকে পেতে

         ((YourApplicationClass)getApplicationContext()).setData("abc"); 

         String data=((YourApplicationClass)getApplicationContext()).getData();  

1

ঠিক আছে আমার কয়েকটি ধারণা আছে তবে আমি জানি না যে সেগুলি আপনার সন্ধান করছে are

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

অথবা আপনার ডেটাটিকে সিরিয়ালযোগ্য বা পার্সেবলে প্যাকেজ করুন এবং সেগুলি একটি বান্ডিলের সাথে সংযুক্ত করুন এবং ক্রিয়াকলাপের মধ্যে বান্ডিলটি পাস করুন।

এটি আপনার যা সন্ধান করছে তা মোটেই নাও হতে পারে, তবে আপনি একটি সাধারণ পছন্দ বা সাধারণ পছন্দগুলি ব্যবহার করে দেখতেও পারেন।

আপনি যে সিদ্ধান্ত নেবেন তা কোনওভাবেই আমাকে জানান।


1

ধরে নিই আপনি ক্রিয়াকলাপটিকে দুটি ক্রিয়াকলাপ থেকে দুটি উদ্দেশ্য হিসাবে ব্যবহার করছেন using
আপনি ইন্টেন্ট.পুটেক্সট্রা () দিয়ে ডেটা পাস করতে পারেন,

আপনার রেফারেন্সের জন্য এটি নিন। ইনটেন্ট.পুটেক্সট্রা সহ অ্যারে প্রেরণ করা হচ্ছে

আশা করি এটি আপনি চান


1

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

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


1

পূর্বোক্ত সমস্ত উত্তর দুর্দান্ত ... আমি কেবলমাত্র এমন কাউকেই যুক্ত করছি যা এখনও কার্যক্রমের মাধ্যমে ডেটা টিকিয়ে রাখার বিষয়ে উল্লেখ করেনি এবং এটি প্রাসঙ্গিক ডেটা বজায় রাখতে অ্যান্ড্রয়েড এসকিউএলাইট ডাটাবেসটি ব্যবহার করতে পারে ... আসলে আপনি নিজের স্থানটি রাখতে পারেন অ্যাপ্লিকেশন অবস্থায় ডাটাবেস হেল্পার এবং এটি সক্রিয়করণের সময় জুড়ে প্রয়োজন হিসাবে কল করুন .. বা কেবলমাত্র একটি সহায়ক ক্লাস করুন এবং যখন প্রয়োজন হবে তখন ডিবি কল করুন ... আপনার বিবেচনার জন্য কেবল একটি অন্য স্তর যুক্ত করুন ... তবে অন্য সমস্ত উত্তরই যথেষ্ট হবে পাশাপাশি .. সত্যিই কেবল পছন্দ


1

ক্রিয়াকলাপগুলির মধ্যে ডেটা ভাগ করা উদাহরণ হিসাবে লগইনের পরে কোনও ইমেল পাস করা

"ইমেল" হল এমন নাম যা অনুরোধ করা হচ্ছে এমন ক্রিয়াকলাপের মান উল্লেখ করতে ব্যবহার করা যেতে পারে

লগইন পৃষ্ঠায় 1 কোড

Intent openLoginActivity = new Intent(getBaseContext(), Home.class);
    openLoginActivity.putExtra("email", getEmail);

হোম পেজে 2 কোড

Bundle extras = getIntent().getExtras();
    accountEmail = extras.getString("email");

1

এবং যদি আপনি ডেটা অবজেক্টের সাথে কাজ করতে চান তবে এই দুটি প্রয়োগ খুব গুরুত্বপূর্ণ:

সিরিয়ালাইজেবল বনাম পার্সেবল

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

public class User implements Parcelable

এখানে আরও চেক করুন

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