سؤال

أنا أعمل على تطبيق Android معقد إلى حد ما يتطلب كمية كبيرة إلى حد ما من البيانات حول التطبيق (أود أن أقول ما مجموعه حوالي 500 كيلو بايت - هل هذا كبير للجهاز المحمول؟). من ما يمكنني قوله ، فإن أي تغيير في الاتجاه في التطبيق (في النشاط ، أكثر دقة) يؤدي إلى تدمير وترفيه كامل للنشاط. استنادًا إلى النتائج التي توصلت إليها ، لا تحتوي فئة التطبيق على نفس دورة الحياة (أي أنها ، لجميع النوايا والأغراض ، التي تم إنشاءها دائمًا). هل من المنطقي تخزين معلومات الحالة داخل فئة التطبيق ثم الرجوع إليها من النشاط ، أم أن هذه الطريقة "المقبولة" بشكل عام بسبب قيود الذاكرة على الأجهزة المحمولة؟ أنا أقدر حقًا أي نصيحة بشأن هذا الموضوع. شكرًا!

هل كانت مفيدة؟

المحلول

لا أعتقد أن 500 كيلو بايت سيكون كبيرًا في الصفقة.

ما وصفته هو بالضبط كيف تعاملت مع مشكلتي في فقدان البيانات في نشاط ما. لقد قمت بإنشاء مفردة عالمية في فئة التطبيق وتمكنت من الوصول إليها من الأنشطة التي استخدمتها.

يمكنك تمرير البيانات حوله في Singleton عالمي إذا كان سيتم استخدامه كثيرًا.

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.

أناقشها هنا في منشور مدونتي, ، تحت القسم "Singleton العالمي".

نصائح أخرى

أولئك الذين يعتمدون على Application على سبيل المثال خاطئ. في البداية ، قد يبدو كما لو Application موجود طالما توجد عملية التطبيق بأكملها ولكن هذا افتراض غير صحيح.

قد يقتل نظام التشغيل العمليات حسب الضرورة. تنقسم جميع العمليات إلى 5 مستويات من "قابلية القتل" محدد في المستند.

لذلك ، على سبيل المثال ، إذا ذهب تطبيقك في الخلفية بسبب الرد على المستخدم في مكالمة واردة ، ثم بناءً على حالة ذاكرة الوصول العشوائي ، قد يقتل نظام التشغيل (أو لا) عمليتك (تدمير Application مثيل في العملية).

أعتقد أن النهج الأفضل سيكون استمر في بياناتك إلى ملف التخزين الداخلي ثم اقرأها عندما يستأنف نشاطك.

تحديث:

حصلت على العديد من التعليقات السلبية ، لذلك حان الوقت لإضافة توضيح. :) حسنًا ، في البداية استخدمت افتراضًا خاطئًا بأن الدولة مهمة حقًا للتطبيق. ومع ذلك ، إذا كان تطبيقك على ما يرام أنه في بعض الأحيان تضيع الحالة (قد تكون بعض الصور التي سيتم إعادة قراءة/إعادة تحميلها) ، فمن الجيد تمامًا الاحتفاظ بها كعضو في Application.

إذا كنت ترغب في الوصول إلى "Singleton Global" خارج النشاط ولا تريد تمرير 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();
}

لكن كن حذرًا جدًا عند تمرير إشارات السياق إلى تجنب تسرب الذاكرة.

ديف ، ما نوع البيانات؟ إذا كانت البيانات العامة تتعلق بالتطبيق ككل (مثال: بيانات المستخدم) ، فسيتم تمديد فئة التطبيق وتخزينها هناك. إذا كانت البيانات تتعلق بالنشاط ، فيجب عليك استخدام معالجات onsaveinstancestate و onrestoreinstancestate لاستمرار البيانات الموجودة في دوران الشاشة.

يمكنك بالفعل تجاوز وظيفة التوجيه للتأكد من عدم تدمير نشاطك وإعادة إنشاؤه. بحث هنا.

يمكنك إنشاء فئة التطبيق وحفظ جميع البيانات الخاصة بك على Calss لاستخدام ذلك في أي مكان في التطبيق الخاص بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top