المشاركات

عرض المشاركات من سبتمبر, 2017

Architecture patterns in Android part 1 - معماريه كتابه الكود في الاندرويد جزء 1

صورة
من الاخطاء الشائعه البدء بمشروع ولم تختار اي معماريه مناسبه للعمل عليها لماذا نحتاج الى معمارية ؟ الجواب بسيط حيث كل شي يحتاج الى الترتيب بصوره جديدة وكذلك تطبيقات الاندرويد تحتاج الى ترتيب بصوره معينه اذا تريد كود بجودة عاليه لابد من استخدام معماريه ماذا يحصل التطيبق الخاص بك من المعمارية ؟ -البساطة : تقسم و تحديد عمل كل مكون من المكونات وعدم التوجه الى المهام المتعددة للمكون , ليكون سهل الفهم والتتبع اذا حدثت مشكله ما -قابليه الاختبار : امكانيه استخدام unit test -صيانه منخفضه الكلفة : سهوله الاضافه والحذف من التطبيق قد تظهر عدة أسئلة قادمة في رأسك. -  ما هو أفضل نمط الهندسة المعمارية تطبيقات الاندرويد؟ - وكيف يمكنني تطبيق هذا النمط بأكثر الطرق فعالية؟ لا يوجد مرشح واحد الذي يناسب جميع مشاريع الاندرويد الخاص بك لأن نمط التصميم هو مجردة وتنفيذها يعتمد على متطلبات محددة. هناك بعض الانماط التي تستخدم لتطبيقات الاندرويد منها: MVC  ( Model — View — Controller) MVP  ( Model — View — Presenter) MVVM  (Model — View — ViewModel) VP  (View —...

Intelligent Job-Scheduling - جدولة الوظائف

الكثير من التطبيقات الحديثة تحتاج الى اداء العديد من المهام بشكل غير متزامن خارج تفاعل المستخدم المباشر , وهذه بعض الامثلة : تحديث موارد الشبكة  تنزيل معلومات تحديث معلومات في الخلفيه background جدولة نظام المكالمات جدولة العمل يساعد على تحسين اداء التطبيق واطالة عمر البطارية هناك الكثير من api التي يمكن استخدامها لجدولة الاعمال في الخلفية ومن هذه الخيارات هو jobScheduler  يساعد على جدوله المهام ويوفر العديد من الوظائف وانه مناسب للمهام الصغيرة والكبيرة  وايضا هناك عدة مرفقات متوفرة للمساعدة على جدولة المهام ومنها : AlarmManager Firebase JobDispathcher SyncAdapter Additional Facilities وهنا نوفر مقدمة موجزة عن jobScheduler  والمرفقات الاخري التي تساعد على جدولة المهام للتطبيق الخاص بك لتحقيق اقصى قدر من اداء التطبيق  Android Framework JobScheduler  هو api لتنفيذ المهام او العمل , اصبح متاح لنظام اندرويد 5.0 وبقى قيد التطور يسمح لك بجمع المعلومات عن المهمه التي تريد ان تنفذها وفي نفس الوقت قد يدمج بين المهمات وهذا الاسلوب يحاف...

Specifying the Code to Run on a Thread - المعالجة الموازية

في هذا الدرس سوف نرى كيف ينفذ Runnable وتشغيل الكود في thread منفصل , نستطيع ارسال runnable وربطه مع thread ويتم تشغيله , كل واحد من runnable يسمى task  thread و runnable هي كلاس بسيط محدود القوة ولكنه يعتبر الاساس للاكثر قوه في نظام الاندرويد مثل handler , acyncTask , intentservice و الrunnable هي الاساس ايضا الى كلاس ThresdPoolExecutor (هو كلاس يدير عملية thread و مهام Queue و يستطيع تشغيل multiple thread متوازية ) تعريف runnable  اما من خلال تعريف كلاس وتضمينه داخلة  public class PhotoDecodeRunnable implements Runnable {     ...     @Override     public void run () {         /*          * Code you want to run on the thread goes here          */         ...     }     ... } او من خلال استخدام lambda في لغه كوتلن: Runnable  { * Code you want to run on the thread goes here }  لا يمكن الو...

Delayed Loading of Views - تأخير تحميل الواجهات

في بعض الحالات نحتاج الى استخدام view معقدة ولكن  نادرا ما نستخدمها حيث يمكن تسريع عمليه التحميل وتقليل استهلاك الذاكرة من خلال عرض ال veiw عند الحاجة اليها فقط وهذه تعد تقنية مهمه عند وجود views معقدة ويمكن استخدام هذه التقنيه بستخدام viewStub ViewStub   هو view خفيف لا يحتوي على ابعاد ولا على رسم داخل layout حيث تكون سهله inflate و سهله المغادرة من التسلسل الهرمي لل layout  وهي تحتاج الى andorid:layout لاضافه layout  Load the ViewStub Layout   يمكن تحميل بواسطة inflater او setVisibility  findViewById ( R . id . stub_import )). setVisibility ( View . VISIBLE ); // or View importPanel = (( ViewStub ) findViewById ( R . id . stub_import )). inflate ();  viewStub لا يعد جزء من التسلسل الهرمي  viewStub لا تدعم <merg/> في التضمين

Re-using Layouts - اعاده الاستخدام

لاعادة استخدام layout بكفائة يمكن استخدام <include/> و<merge/> لتضمين layout داخل layout الحالية اعاده الاستخدام قوي جدا لانه يسمح لك بتصمين layout معقده بدلا من اعادة اضافتها في كل الواجهات مثال : نريد تضمين هذه layout <FrameLayout xmlns:android = "http://schemas.android.com/apk/res/android"     xmlns:tools = "http://schemas.android.com/tools"     android:layout_width = "match_parent"     android:layout_height = "wrap_content"     android:background = "@color/titlebar_bg"     tools:showIn = "@layout/activity_main" >     <ImageView android:layout_width = "wrap_content"                 android:layout_height = "wrap_content"                 android:src = "@drawable/gafricalogo" /> </FrameLayout>  ملاحظة: tools:showIn تستخدم وقت التصميم فقط لاضهار هذه layout في واجهات اخرى لغرض التعديل  ا...

Improving Layout Performance - تحسين اداء الواجهات

صورة
layout هي مفتاح تطبيقات الاندرويد التي لها تأثير مباشر على تجربة المستخدم UX اذا كانت سيئة التنفيذ يمكن ان تؤدي الى استهلاك الذاكرة وهنا سوف نتكلم عن كيف تكون الواجهات سلسة وتاخذ مساحة قليلة من الذاكرة الدرس الاول    1. تحسين التسلسل الهرمي للواجهات - Optimizing Layout Hierarchies هو نفس فكره صفاح الويب المعقدة تأخذ وقت في التحميل , فأن التسلسل الهرمي اذا كان معقد جدا يمكن ا يسبب مشاكل في الاداء  من المفاهيم الخاطئه الشائعة الن استخدام layout بسيطة يؤدي الى كفاءه اكثر  على كل حال عند layout او widget تظيفها الى التطبيق الخاص بك تتطلب تهيئه و تخطيط و رسم مثلا عند انشاء linearLayout متداخلة هذا يودي الى تسلسل هرمي عميق للغاية وعلاوة على ذلك عند استخدام مثلا layout_weight يمكن ان يكون مكلف جدا حيث يحتاج كل layout ابن لقياس مرتين وخاصتا  عند استخدام layoutInflater مرارا وتكرارا 1. فحص الواجهات  يحتوي android SDK على اداة hierarvhy view تساعد على تحليل layout عند تشغيل التطبيق تستخدم لاكتشاف الاخطاء واختناقات الاداء   تعمل ه...

Performance Tips نصائح الاداء

نغطي هنا بعض التحسينات التي يمكن ان تؤدي الى تحسن اداء التطبيق بشكل عام ولكن من غير المحتمل ان تودي هذه تغييرات كبيرة , يجب اختيار الخوارزميات وهياكل البيانات الصحيحة ولها الاولوية دائما . هناك نوعين من القواعد الاساسية لكتابة كود فعال  : لا تقم بعمل لا تحتاج الى القيام به  لا تقم بتخصيص الذاكرة اذا كنت تستطيع تجنب ذلك   تعد واحدة من اصعب المشاكل التي ستواجهها هو ان من المؤكد ان تطبيقك يعمل على انواع متعددة من الاجهزة واصدارات مختلفة حيث يمكن ان يكون هناك فارق في السرعة من جهاز الاخر وان التطبيق الذي يعمل عندك بسرعة ليس دائما هو الافضل لضمان اداء التطبيق بشكل جيد عبر مجموعة من الاجهزة تأكد من ان الشفرة فعالة علي جميع المستويات وقم بتحسين الاداء بشكل فعال   1. تجنب انشاء كائنات غير ضرورية  انشاء الكائن غير مجاني لان تخصيص الذاكرة يكون اكثر تكلفة من عدم تخصيص الذاكرة ولذلك تجنب انشاء كائنات لا تحتاج اليها وهذه بعض الامثلة : - اذا كانت هناك fun تعيد string و يضاف الي StringBuffer دائما وانت متاكد من ذلك غير الدالة والحق string مباشرتا الى ...