سؤال

أواجه مشكلة في الذاكرة بعد تشغيلها عدة مرات.

java.lang.outofmemoryerror: حجم صورة نقطية يتجاوز ميزانية VM

أعتقد أنني كنت أتسرب الذاكرة بطريقة ما ، لذا قمت بتفريغ ملف HPROF واستخدمت أداة MAT لمعرفة ما هو الخطأ. اتضح أنه بعد الركض مثل 5 أضعاف التطبيق والإقلاع ، أجد 5 حالات من نشاطي و 5 حالات من phonestatelistener.

إذا قمت بإزالة المكالمة إلى Phonestatelistener ، لم أعد أمتلك هذه المشكلة وأرى مثالًا واحدًا فقط من نشاطي.

والسؤال هو ، كيف يمكنني حل هذا؟

شكرًا

دانيال


ها هو رمزتي:

طريقة oncreate:

telephonyManager.listen(mPhoneListener,
                PhoneStateListener.LISTEN_SERVICE_STATE
                | PhoneStateListener.LISTEN_SIGNAL_STRENGTH
                | PhoneStateListener.LISTEN_CALL_STATE
                | PhoneStateListener.LISTEN_DATA_CONNECTION_STATE
                | PhoneStateListener.LISTEN_DATA_ACTIVITY); 

على فئة النشاط:

PhoneStateListener mPhoneListener = new PhoneStateListener() {
        public void onCallStateChanged(int state,
                java.lang.String incomingNumber) {
        //do something
    }
}

على طريقة ondestroy:

telephonyManager.listen(mPhoneListener, PhoneStateListener.LISTEN_NONE);        
mPhoneListener = null;
هل كانت مفيدة؟

المحلول

Ondestroy غير مضمون للاستدعاء. مصدر: مستندات ondestroy

يجب أن تحاول التنظيف على onpause ثم إعادة تهيئة الأشياء التي تحتاجها. هذا سيساعد على تنظيف بعض ضغط الذاكرة والتسربات.

نصائح أخرى

الجواب أعلاه غير صحيح: OnDestroy () ليس مشكلة هنا لأن قتل العملية من الواضح أن تحرير جميع الذاكرة والمجلدات.

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

أفضل شيء يمكنك القيام به هو إزالة المراجع من المستمع إلى كائنات أخرى يدويًا عند الانتهاء من ذلك في OnDestroy ().

PhoneStateListener mPhoneListener = new PhoneStateListener() 
{ 
    public void onCallStateChanged(int state, java.lang.String incomingNumber) 
    { 
    //do something 

     telephonyManager.listen(mPhoneListener, PhoneStateListener.LISTEN_NONE); 
     mPhoneListener = null;
    } 
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top