آموزش: نکات و اصول مهم در برنامه نویسی Java/Android
همونطور که می دونید، دستگاه های مبتنی بر اندروید (مثل گوشی، تلویزیون، ساعت، دوربین، ربات و...) با محدودیت منابع روبرو هستند... پس در حین خوندن مقالات اندروید اگر با واژه 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>
مخصوصاً مورد 26 ، فکر کنم استاد تو همه آموزش ها این مورد رو تاکید می کنن.
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .