آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
مشکل عدم دسترسی خریداران پیشین به برخی آموزش ها برطرف شد
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

آموزش: نکات و اصول مهم در برنامه نویسی Java/Android

Y.P.Y  9 سال پیش  9 سال پیش
+46 0

همونطور که می دونید، دستگاه های مبتنی بر اندروید (مثل گوشی، تلویزیون، ساعت، دوربین، ربات و...) با محدودیت منابع روبرو هستند... پس در حین خوندن مقالات اندروید اگر با واژه performance بارها و بارها روبرو شدید تعجب نکنید.

1- زمانی که دستگاه با وضعیت Low-Memory مواجه می شه، متد onStop() توسط DVM نادیده گرفته میشه. پس حتاالمکان برنامه و اطلاعات مهمش رو در متد onPause() finalize کنید و نه در متد onStop(). همچنین در وضعیت Low-Memory، گاهی پیشنهاد اجرای System.runFinalization(); و System.gc(); به DVM می تونه کارساز باشه.

2- طبق گفته گوگل، حتاالمکان متد ها رو static تعریف کنید. اینکار سرعت پردازش رو 15 تا 20 درصد افزایش میده.

3- HttpURLConnection یا Apache HTTP؟ طبق گفته ی وبلاگ Jesse Wilsonc، عضو تیم توسعه DVM، Apache HTTP در اندروید Froyo و قبل تر باگهای کمتر و بیشترین سازگاری رو داره. درحالی که HttpURLConnection در اندروید Gingerbread و جدیدتر باگهای کمتر، امکانات بیشتر، بهینه تر و سازگاری بیشتری رو داره... پس در انتخاب اینها دقت کنید.

4- طبیعتاً کار با primitive نوع int بسیار سریعتر و بصرفه تر از کار با شی Integer هست!

5- طبق گفته Sun، IBM، oReilly و Sys-Con حتاالمکان متغیر ها و متد ها رو final تعریف کنید. اینکار performance برنامه رو بسیار افزایش میده.

6- در برنامه هایی که activity های متعددی دارید، با بررسی flag های Intent و startActivity مطمعن بشید که هنگام فراخوانی activity، اون رو مجدداً reset نمی کنید و فقط به foreground هدایتش می کنید.

7- در همه برنامه ها، exception ها و خطاها رو (در یک متغیر یا فایل) log کنید و توسط فرمی (با اجازه کاربر!) برای سرور/گیرنده خودتون ارسال کنید. با اینکار یک سیستم bug report مناسب رو پیاده سازی کردید که بسیار به رفع اشکالات و بهبود برنامه تون کمک خواهد کرد.

8- هرگز بدون اجازه کابر، برنامه رو update نکنید!

9- هرگز بدون آگاهسازی کابر، اطلاعات اینترنتی رو دریافت و ارسال نکنید!

10- طبق گفته API doc گوگل، برای چک کردن اتصال اینترنتی(نه Ethernet)، از توابع getActiveNetworkInfo() و isConnected() و کلاس ConnectivityManager استفاده کنید. و درصورت قطع/خاموش بودن router/modem، اون موقع از exception ها کمک بگیرید. نیازی هم به ping کردن به سایت google نیست.

نکته: برای استفاده از این دسته توابع/کلاسها به دسترسی android.permission.ACCESS_NETWORK_STATE نیاز دارید.

11- آیا میدونید LayoutOpt لایه های UI برنامه شمارو optimize می کنه؟

12- در زمان دانلود یا parse کردن داده های textual، از gZip استفاده کنید. (منظور کمپرس کردن String نیست) اینکار performance برنامه رو بسیار افزایش میده.

13- حتاالمکان از فراخوانی و کار با کلاس اشیا بصورت مستقیم در داخل حلقه ها خودداری کنید. سعی کنید اونها رو به متغیرها انتقال بدید و بعد متغیر رو وارد حلقه کنید.

14- استفاده از StringBuilder یا char array سریعتر و بصرفه تر از استفاده از شی String هستش. (در شرایط یکسان)

همچنین شی String از نوع immutable هستش و امکان استفاده مجدد از اون وجود نداره. اما درعوض می تونید از شی StringBuilder استفاده کنید که اکثر امکانات شی String رو بهتون میده و قابلیت reuse شدن هم داره.

15- آیا می دونید ProGuard چیه؟

16- application context با activity context متفاوته و هرکدوم باید در جای خودشون استفاده بشن. برای نمونه، شما باید به دستور Toast، کانتکس نوع application بدید که شی یکبار ساخته بشه و با بسته/مخفی شدن برنامه، پیام و شی هم از بین بره.

17- وقتی که با SQLite کار می کنید، هرگز Index گذاری رو فراموش نکنید. اینکار سرعت پیمایش در جداول رو بسیار افزایش میده.

18- برای parse کردن XML حتاالمکان از string manipulation بجای XPath استفاده کنید. اینکار سرعت پردازش رو تا چند برابر افزایش میده.

19- طبق گفته گوگل، تصاویر PNG رو توسط برنامه OptiPNG یا PNGCrush بهینه سازی کنید. این برنامه ها قادرند header های اضافی داخل فایل تصویر رو حذف و تصویر رو compress کنند.

20- با استفاده از ابزار Lint گوگل، پروژه اندروید تون رو برای پیدا کردن bug های پنهان/خفیف اسکن کنید.

نکته: این ابزار Lint داخل پکیج ADT plugin گوگل قرار داره.

Project explorer -> right click on project -> Android tools -> [ClearLint markers]Project explorer ->
right click on project -> Android tools -> [RunLint:Checkfor common errors]

21- بجای استفاده از Thread های سنگین UI، می تونید از AsyncThread ها استفاده کنید.

22- اگر برنامه قراره که زمان زیادی روی screen نمایش داده بشه (مثل خبر خوان ها)، از background رنگ مشکی استفاده کنید. اینکار مصرف باطری رو به میزان قابل توجهی کاهش میده، مخصوصاً در گوشی ها و تبلت های AMO-LED! -.-

23- بجای استفاده از تصویر سیاه از رنگ سیاه #000000 استفاده کنید. بجای استفاده از تصویر سفید از رنگ سفید #FFFFFF استفاده کنید و امثالش... خیلی ها به این نکته ابتدایی توجه نمی کنند و اغلب در برنامه هاشون با مشکل OutOfMemory مواجه میشن.

چون در دستگاه های مبتنی بر Android، تصاویر bitmap (بسته به حجم، کیفیت و resolution) مقدار بسیار زیادی از حافظه دستگاه رو برای پردازش/نمایش اشغال می کنند.

24- طبق گفته گوگل، حتاالمکان بصورت مستقیم/directly فیلد های اشیا رو فراخوانی کنید، بجای استفاده از setter/getter.

25- بر طبق benchmark های موجود(دستگاه های قدیمی!)، در اندروید، پردازش داده نوع float تقریباً 2 برابر کندتر از پردازش داده نوع int هست، درحالیه که در مورد داده نوع double اینطور نیست. پس در بیشتر موارد، نوع double جایگزین خوبی برای نوع float هستش.

26- همیشه وقتی که از کلاس Vibrator, ConnectivityManager و امثالش استفاده می کنید، حتماً حتماً از NULL نبودن مقدار برگشتی توسط این کلاسها مطمعن بشید.

چراکه هیچ تضمینی نیست اینگونه کلاسها از نظر نرم افزاری و سخت افزاری بدون مشکل باشن یا 100% return کنن. مثال:

final ConnectivityManager _CM = (ConnectivityManager)this.getSystemService("connectivity");
if(_CM != null)
{
...
 

27- حتاالمکان از convertView بجای Adapter.getView() در list adapter ها استفاده کنید. اینکار به شما اجازه بهره برداری مجدد از view ساخته شده رو میده.

28- با implements کردن اینترفیس OnClickListener دیگه نیازی به inline coding و کثیف کاری در متد onCreate() نیست. :)

29- چقدر در مورد AtomicBoolean() ها می دونید؟

30- وقتی که برای دوربین دستگاه برنامه می نویسید، حتماً چک کنید که دستگاه دوربین داره یا نداره، و اگر هم داره جلو یا عقب! در آخر هم توسط متد release() اون رو آزاد کنید.

31- وقتی که می شود byte، پس چرا int؟ وقتی که می شود short پس چرا int؟

private final byte _UPDATE_DIALOG =1, _HELP_DIALOG =2, _EXIT_DIALOG =3;

32- طبق گفته گوگل، حتاالمکان از حلقه enhanced for (یا همون for each) بجای حلقه for استفاده کنید. اینکار سرعت پردازش حلقه رو تا 3 برابر افزایش میده.

33- همیشه تگ android:targetSdkVersion در فایل AndroidManifest.xml رو تعریف کنید و بحالت بیشفرض رها نکنید.

34- در مقدار دهی به تگ android:launchMode در فایل AndroidManifest.xml دقت کنید. این تگ وضعیت instance اون activity رو تعیین می کنه!

35- همیشه/حتاالمکان تگ android:allowClearUserData رو true قرار بدید.

36- حتاالمکان تگ install location رو both قرار بدید تا کاربر بتونه برنامه رو در محل موردنظرش نصب کنه.

37- طبق گفته کتاب معروف Professional Android 4 Development، دستور Toast باید در GUI Threat ساخته و نمایش داده بشه، درغیر این صورت ریسک پرتاپ شدن استثنا cross-thread وجود خواهد داشت:

public static final void myToast(final Activity ACTIVITY_CONTEXT, final String MESSAGE)
{
    ACTIVITY_CONTEXT.runOnUiThread(new Runnable()
    {
        public void run()
        {
            Toast.makeText(ACTIVITY_CONTEXT.getApplication(), MESSAGE, Toast.LENGTH_LONG).show();
        }
    });
    return;
}

38- آیا می دونید Bitmap ها در اندروید قبل از Honeycomb در حافظه Native Heap ذخیره می شن ولی در اندروید Honeycomb به بعد در حافظه VM Heap؟

39- هرگز بدون اجازه کابر، SMS و MMS ارسال نکنید!

40- در بعضی از موارد با اضافه کردن تگ زیر در خط اول فایل AndroidManifiest.xml، مشکل Couldn't resolve resource... برطرف خواهد شد:

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE xml>
اگر تناقضی مشاهده کردید، با ذکر منبع/دلیل اطلاع بدید تا اصلاحش کنم.
 
+5 0
اگه مدیران این تاپیک رو مناسب می دونن، شاید بد نباشه که به بالا صفحه بچسبوننش... چون اگه استقبال بشه بخش دومش(پیشرفته) رو هم میزارم. اگرم نشه که همینجا پایانش بدم (9 سال پیش)
+2 0
بسیار بسیار ممنون؛ عالی بود. مدیران عزیز حتما حمایت کنن. (9 سال پیش)
+2 0
جالب اینجاست اکثر نکاتی که در بالا ذکر شده توسط استاد در آموزش مطرح شده . خیلی ممنون :) (9 سال پیش)
+4 0
ضمن تشکر باید در نظر داشت طرح این نکات در کنار هم و در یک تاپیک علیرغم وجود پراکنده بعضی از اونها در آموزش ها بسیار ارزنده و موجب قدردانیست . (9 سال پیش)
 برای این سوال 1 پاسخ وجود دارد.
پاسخ به سوال 
مهدی  9 سال پیش
0 0

مخصوصاً مورد 26 ، فکر کنم استاد تو همه آموزش ها این مورد رو تاکید می کنن.


پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .