OutOfMemory واستخدام الصور المتجهة في Android Studio

مرحبا يا هبر! في هذه المقالة ، التي تستهدف المبتدئين ، أود أن أقدم بعض النصائح حول تحسين استخدام ذاكرة الجهاز من خلال التطبيق ، حتى لا تحصل على OutOfMemory باستمرار ، وكذلك النظر في استخدام الصور المتجهة في الإصدار الحالي الحالي من Android Studio (3.4) ، حيث أن معظم موارد اللغة الروسية في هذا الموضوع (آخر مقالة عن حبري حول صور المتجهات يعود إلى عام 2015) قديم ، وغالبًا ما يضلل المطورين المبتدئين. لذلك دعونا نبدأ.

1. استخدام الصور المتجهة بدلا من الصور النقطية


بالطبع ، لا ينبغي تحويل الصور الكبيرة التي تحتوي على الكثير من التفاصيل الصغيرة إلى متجه - حيث سيشغل ذلك مساحة كبيرة مثل مساحة البيانات النقطية ، إن لم يكن أكثر. ومع ذلك ، يجب تحويل الصور الصغيرة ، مثل الرموز والتفاصيل الأخرى لواجهة المستخدم إلى متجه من أجل حفظ الذاكرة. وغالبًا ما يكون العمل مع الصور المتجهة أكثر ملاءمة. والآن ، الشيء الأكثر أهمية - كيف نفعل ذلك؟

  1. افتح Android Studio.
  2. انقر بزر الماوس الأيمن على المجلد القابل للدخول أو محتوياته> جديد> Vector Asset

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

  4. التالي> إنهاء
  5. القيام به!

للتحويل من خطوط المسح إلى المتجهات ، يمكنني أن أوصي بتطبيق Inkscape مجاني وممتاز. قليلا عن العمل معه:

  1. افتح إنكسكيب.
  2. اسحب أي خطوط المسح إلى ذلك. في النافذة التي تفتح ، حدد خيارات الاستيراد وانقر فوق موافق.
  3. في شريط الأدوات العلوي ، بعد تحديد صورتنا ، حدد Path> Vectorize raster (Shift + Alt + B).
  4. الآن الشيء الأكثر أهمية. في النافذة الجديدة ، حدد المربع بجوار "إزالة الخلفية" وحدد ما يلي: ما إذا كانت صورتنا ستكون ملونة ، وعدد عمليات الفحص التي يجب إجراؤها. يجب ألا ننسى أن حجم ملف المتجه لدينا يعتمد بشكل مباشر على هاتين المعلمتين.

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

  5. أغلق النافذة ، وانقر فوق البيانات النقطية وحذفها باستخدام مفتاح "الحذف" ، وانتقل إلى "ملف"> "خصائص المستند" (Shift + Ctrl + D) ، واضبط حجم الصفحة للمحتوى.

الآن سنقوم بإجراء اختبار صغير يثبت ميزة المتجه في حفظ الذاكرة.
لقد أنشأت مشروعًا جديدًا باستخدام ImageView واحد ، حيث قمت بتطبيق رسم متحرك يقوم بنقله من النقطة A إلى النقطة B ، مع تغيير الصور بالتناوب إلى الخطوط النقطية والتناوب. نحن ننظر إلى البيانات.

النقطية



سهم التوجيه



الفرق هو تقريبا مرتين. أعتقد أن هذا مقنع للغاية.

2. زيادة حجم الكومة


للقيام بذلك ، انتقل إلى بيان مشروعك (التطبيق> البيانات> AndroidManifest.xml) وأضف السطر في عمود التطبيق:

android:largeHeap="true" 

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

3. تجنب تسرب الذاكرة


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

بمفردي ، أود تقديم المشورة لمكتبة WeakHandler ، التي طورتها Badoo ، ومصممة للقضاء على تسرب الذاكرة المرتبط بإساءة استخدام android.os.Handler. لاستخدام هذه المكتبة ، أضف السطر التالي إلى عمود التبعيات في ملف gradle الخاص بك (Gradle Scripts> build.gradle (Module: app)):

 compile 'com.badoo.mobile:android-weak-handler:1.1' 

وفي ملف جافا:

 private WeakHandler mHandler; protected void onCreate(Bundle savedInstanceState) { mHandler = new WeakHandler(); ... } private void onClick(View view) { mHandler.postDelayed(new Runnable() { view.setVisibility(View.INVISIBLE); }, 5000); } 

ولا تنس استيراد WeakHandler نفسه إذا كان الاستوديو لا يقوم بذلك تلقائيًا.

4. تجنب الرسوم المتحركة الفاصل الزمني


الرسوم المتحركة بالإطار تلو الآخر في Android Studio شيء ملائم ، ولكنها ليست الأكثر اقتصادا. إذا كنت تستخدم عددًا كبيرًا من الصور فيه ، فستحصل بالتأكيد على OutOfMemory.

ولكن ، إذا كنت بحاجة إليها حقًا ، فمن الأفضل استخدام صورة gif مع مكتبة Android Gif Drawable . تعمل هذه المكتبة على تبسيط العمل باستخدام gifs وتستهلك أيضًا ذاكرة أقل بكثير من الرسوم المتحركة للإطار في Android Studio. لاستخدام هذه المكتبة ، أضف السطر التالي إلى عمود التبعيات في ملف gradle الخاص بك (Gradle Scripts> build.gradle (Module: app)):

 implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.16' 

وفي ملف gradle Script الخاص بك (Gradle Scripts> build.gradle (الوحدة: "اسم التطبيق الخاص بك")) في مخطط البناء وأعمدة allproject السطر:

 mavenCentral() 

وفي ملف جافا:

 GifDrawable gifFromResource = new GifDrawable( getResources(), R.drawable._ ); gifFromResource.start(); 

لتعطيل gif ، بدلاً من start () ، اكتب stop (). أيضًا لا تنس ضغط ملفات GIF ، فهذا سيوفر مساحة أكبر.

آمل أن مقالتي كانت مفيدة لك. شكرا لك

Source: https://habr.com/ru/post/ar450566/


All Articles