loading...

مرجع تخصصی بروزترین مقالات طراحی اپلیکیشن

بازدید : 19
پنجشنبه 5 تير 1404 زمان : 11:23


سرو صدا مصرف یاد در دوران کوتاه
سروصدا نشانه‌دهنده وجود ناپایداری میباشد و این مورد در زمینه ی مصرف خاطر در اندروید نیز صحت می‌نماید. هنگامی که‌این نوع از سر مشق را مراعات می کنیم، معمولاً تعداد متعددی اشیای پرهزینه ساخت گردیده‌اند و در حین چرخه قدمت کوتاهشان کنار طراحی اپلیکیشن در مشهد گذارده می شوند.


سر وصدا در مصرف خاطر
برای بازتولید این ایراد، نمونه Numerous GCs را در نرم افزار دمو انجام نمائید. در‌این نمونه از RecyclerView برای اکران دو تصویر bitmap به طور متناوب مصرف شده میباشد که تصویر تعالی‌خیس دارنده وضوح تصویر 1000 در 1000 پیکسل و تصویر خرد‌خیس دارنده وضوح 256 در 256 پیکسل میباشد. RecyclerView را اسکرول نمایید تا غوغا آشکار را در پروفایلر یاد ملاحظه کنید. همینطور تجربیات کاربری در نرم افزار تلفن همراه نماید می شوند.


RecyclerView نماید
1class NumerousGCActivity: AppCompatActivity() {
2
3 val NO_OF_VIEWS = 100000
4
5
6 override fun onCreate(savedInstanceState: Bundle?) {
7 super.onCreate(savedInstanceState)
8 setContentView(R.layout.activity_numerous_gc)
9 btn_start.setOnClickListener {
10 setupRecyclerView()
11 }
12 }
13
14 private fun setupRecyclerView() {
15 val numbers = arrayOfNulls(NO_OF_VIEWS).mapIndexed { index, _ -> index }
16 recyclerView.layoutManager = LinearLayoutManager(this)
17 recyclerView.adapter = NumerousGCRecyclerViewAdapter(numbers)
18 }
19}
20
21class NumerousGCRecyclerViewAdapter(private val numbers: List): RecyclerView.Adapter() {
22 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NumerousGCViewHolder {
23 val view = LayoutInflater.from(parent.context)
24 .inflate(R.layout.item_numerous_gc, parent, false)
25 return NumerousGCViewHolder(view)
26 }
27
28 override fun getItemCount(): Int {
29 return numbers.size
30 }
31
32 override fun onBindViewHolder(vh: NumerousGCViewHolder, position: Int) {
33 vh.textView.text = position.toString()
34
35 //Create bitmap from resource
36 val bitmap = if(position % 2 == 0)
37 BitmapFactory.decodeResource(vh.imageView.context.resources, R.drawable.big_bitmap)
38 else
39 BitmapFactory.decodeResource(vh.imageView.context.resources, R.drawable.small_bitmap)
40 vh.imageView.setImageBitmap(bitmap)
41 }
42}
43
44class NumerousGCViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
45 var textView: TextView = itemView.findViewById(R.id.text_view)
46 var imageView: ImageView = itemView.findViewById(R.id.image_view)
47}
مشاهده بدون نقص کدها
در این‌حالت کد نمونه برای پیاده‌سازی RecyclerView درست به کارگیری می‌گردد و با این حالا با ایرادات خاطر مواجه هستیم. حتی با این که RecyclerView راه حل خلل خاطر گذشته میباشد، ولی یک چاره همگی‌کاره برای کلیه اشتباهات یاد به اکانت نمی‌آید. برای یافتن ریشه نقص‌ می بایست داده ها بیشتری را آیتم نظارت در اختیار بگذاریم.

روی دکمه Record در پروفایلر یاد کلیک نمایید و برای مدتی به RecyclerView بروید بعد روی دکمه stop کلیک نمایید. براین اساس پروفایلر لیستی تفصیلی از مصرف یاد از سوی اشکال شیءهای گوناگون در دست شما قرار می دهد.


ریزه کاری تفصیلی مصرف یاد
فهرست را مبتنی بر اندازه سطحی تر و تمیز‌سازی فرمایید تا مشاهده کنید که مورد فوقانی یک آرایه بایت میباشد و از این رو میدانیم که نصیب بیشتر اختصاص یاد به تولید آرایه بایت تخصیص دارااست. فقط 32 اختصاص برای آرایه بایت وجود داراست و اندازه کلی بیت‌ها 577,871,888 میباشد که مساوی 72.23 مگابایت میباشد.

برای این که داده ها بیشتری به دست آوریم روی یکی نوبت‌های نما کلیک میکنیم تا اختصاص پشته فراخوانی را نیز ببینیم. سیاق هایلایت گردیده ()onBindViewHolder از NumerousGCRecyclerViewAdapter میباشد، البته ما هیچ آرایه بایتی را به طور مصرح با این روال نساخته‌ایم

در حالتی‌که به اسلوب آتی ()onBindViewHolder در پشته فراخوانی نگاه کنیم، می بینیم که‌این روال فراخوانی‌هایی در مسیر پایین ایفا می‌نماید:

decodeResource() -> decodeResourceStream() -> decodeStream() -> nativeDecodeAsset()
و در غایت به ()newNonMovableArray میرسد. مستندات این اسلوب اینگونه اعلام می‌نمایند که:

این اسلوب یک آرایه اختصاص‌یافته در یک سود از هیپ جاوا رجوع می دهد که هیچ زمان جابجا نخواهد شد. اسلوب آیتم اشاره برای پیاده‌سازی اختصاص‌های نیتیو روی هیپ جاوا مانند DirectByteBuffers و Bitmaps به کارگیری میگردد.

از این رو می توانیم فیض بگیریم که مصرف بالای خاطر آرایه‌های بایت ناشی از استعمال از اسلوب ()nativeDecodeAsset میباشد.

در واقع هر توشه که ما ()BitmapFactory.decodeResource را فراخوانی می کنیم، یک دفعه تازه از یک شیء بیت‌مپ ساخت و ساز می‌گردد و از این رو داده‌های آرایه بایت جدیدی اضافه میشوند. درصورتی که بتوانیم فراوانی احضار ()BitmapFactory.decodeResource را کاهش دهیم خواهیم توانست از نیاز به اختصاص یاد بیشتر دوری کنیم و از این رو از حادثه Garbage Collection بکاهیم.

1class LessNumerousGCRecyclerViewAdapter(private val context: Context,
2 private val numbers: List): RecyclerView.Adapter() {
3
4 val bitBitmap = BitmapFactory.decodeResource(context.resources, R.drawable.big_bitmap)
5 val smallBitmap = BitmapFactory.decodeResource(context.resources, R.drawable.small_bitmap)
6
7 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NumerousGCViewHolder {
8 val view = LayoutInflater.from(parent.context)
9 .inflate(R.layout.item_numerous_gc, parent, false)
10 return NumerousGCViewHolder(view)
11 }
12
13 override fun getItemCount(): Int {
14 return numbers.size
15 }
16
17 override fun onBindViewHolder(vh: NumerousGCViewHolder, position: Int) {
18 vh.textView.text = position.toString()
19
20 //Reuse bitmap
21 val bitmap = if(position % 2 == 0) bitBitmap else smallBitmap
22 vh.imageView.setImageBitmap(bitmap)
23 }
24}
مشاهده بی نقص کدها
کد فوق ورژن بهبودیافته‌ای از RecyclerViewAdapter میباشد که دفعه‌های بیت‌مپ را صرفا یک توشه ساخت می‌نماید، آنها‌را کش می‌نماید و از این بیت‌مپ‌ها برای imageView در روال ()onBindViewHolder به کار گیری دوباره می‌نماید. به این ترتیب از هر اختصاص خاطر غیرضروری دیگری اجتناب میشود. در‌پی به گراف یاد بعداز این بهبود نگاهی می‌اندازیم.


چنان که میبینید گراف خاطر صاف میباشد و صرفا یک اختصاص برای آرایه بایت وجود دارااست که اندازه آن ناچیز میباشد. در ضمنً نرم افزار در حال حاضر قادر است به صورت خل وچل اسکرول خواهد شد و هیچ نوع گیر کردن فیس نمی‌دهد. بنابراین ایراد یاد را حل کرده‌ایم.


RecyclerView جاری
عده بندی
امید خواهیم داشت با تفحص این راهنما ایده‌ای در خصوص نحوه به کارگیری از ابزار پروفایل کردن برای بررسی اشتباهات عملکردی نرم افزار‌های اندروید به دست آورده باشید. همواره به مصرف یاد در نرم افزار خویش دقت داشته باشید و از اختصاص منابع یاد غیرضروری اجتناب نمائید. کافی میباشد به خیال داشته باشید که مقصود ما این میباشد که گراف مصرف خاطر تا حد قابلیت و امکان مسطح باشد.


سرو صدا مصرف یاد در دوران کوتاه
سروصدا نشانه‌دهنده وجود ناپایداری میباشد و این مورد در زمینه ی مصرف خاطر در اندروید نیز صحت می‌نماید. هنگامی که‌این نوع از سر مشق را مراعات می کنیم، معمولاً تعداد متعددی اشیای پرهزینه ساخت گردیده‌اند و در حین چرخه قدمت کوتاهشان کنار طراحی اپلیکیشن در مشهد گذارده می شوند.


سر وصدا در مصرف خاطر
برای بازتولید این ایراد، نمونه Numerous GCs را در نرم افزار دمو انجام نمائید. در‌این نمونه از RecyclerView برای اکران دو تصویر bitmap به طور متناوب مصرف شده میباشد که تصویر تعالی‌خیس دارنده وضوح تصویر 1000 در 1000 پیکسل و تصویر خرد‌خیس دارنده وضوح 256 در 256 پیکسل میباشد. RecyclerView را اسکرول نمایید تا غوغا آشکار را در پروفایلر یاد ملاحظه کنید. همینطور تجربیات کاربری در نرم افزار تلفن همراه نماید می شوند.


RecyclerView نماید
1class NumerousGCActivity: AppCompatActivity() {
2
3 val NO_OF_VIEWS = 100000
4
5
6 override fun onCreate(savedInstanceState: Bundle?) {
7 super.onCreate(savedInstanceState)
8 setContentView(R.layout.activity_numerous_gc)
9 btn_start.setOnClickListener {
10 setupRecyclerView()
11 }
12 }
13
14 private fun setupRecyclerView() {
15 val numbers = arrayOfNulls(NO_OF_VIEWS).mapIndexed { index, _ -> index }
16 recyclerView.layoutManager = LinearLayoutManager(this)
17 recyclerView.adapter = NumerousGCRecyclerViewAdapter(numbers)
18 }
19}
20
21class NumerousGCRecyclerViewAdapter(private val numbers: List): RecyclerView.Adapter() {
22 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NumerousGCViewHolder {
23 val view = LayoutInflater.from(parent.context)
24 .inflate(R.layout.item_numerous_gc, parent, false)
25 return NumerousGCViewHolder(view)
26 }
27
28 override fun getItemCount(): Int {
29 return numbers.size
30 }
31
32 override fun onBindViewHolder(vh: NumerousGCViewHolder, position: Int) {
33 vh.textView.text = position.toString()
34
35 //Create bitmap from resource
36 val bitmap = if(position % 2 == 0)
37 BitmapFactory.decodeResource(vh.imageView.context.resources, R.drawable.big_bitmap)
38 else
39 BitmapFactory.decodeResource(vh.imageView.context.resources, R.drawable.small_bitmap)
40 vh.imageView.setImageBitmap(bitmap)
41 }
42}
43
44class NumerousGCViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
45 var textView: TextView = itemView.findViewById(R.id.text_view)
46 var imageView: ImageView = itemView.findViewById(R.id.image_view)
47}
مشاهده بدون نقص کدها
در این‌حالت کد نمونه برای پیاده‌سازی RecyclerView درست به کارگیری می‌گردد و با این حالا با ایرادات خاطر مواجه هستیم. حتی با این که RecyclerView راه حل خلل خاطر گذشته میباشد، ولی یک چاره همگی‌کاره برای کلیه اشتباهات یاد به اکانت نمی‌آید. برای یافتن ریشه نقص‌ می بایست داده ها بیشتری را آیتم نظارت در اختیار بگذاریم.

روی دکمه Record در پروفایلر یاد کلیک نمایید و برای مدتی به RecyclerView بروید بعد روی دکمه stop کلیک نمایید. براین اساس پروفایلر لیستی تفصیلی از مصرف یاد از سوی اشکال شیءهای گوناگون در دست شما قرار می دهد.


ریزه کاری تفصیلی مصرف یاد
فهرست را مبتنی بر اندازه سطحی تر و تمیز‌سازی فرمایید تا مشاهده کنید که مورد فوقانی یک آرایه بایت میباشد و از این رو میدانیم که نصیب بیشتر اختصاص یاد به تولید آرایه بایت تخصیص دارااست. فقط 32 اختصاص برای آرایه بایت وجود داراست و اندازه کلی بیت‌ها 577,871,888 میباشد که مساوی 72.23 مگابایت میباشد.

برای این که داده ها بیشتری به دست آوریم روی یکی نوبت‌های نما کلیک میکنیم تا اختصاص پشته فراخوانی را نیز ببینیم. سیاق هایلایت گردیده ()onBindViewHolder از NumerousGCRecyclerViewAdapter میباشد، البته ما هیچ آرایه بایتی را به طور مصرح با این روال نساخته‌ایم

در حالتی‌که به اسلوب آتی ()onBindViewHolder در پشته فراخوانی نگاه کنیم، می بینیم که‌این روال فراخوانی‌هایی در مسیر پایین ایفا می‌نماید:

decodeResource() -> decodeResourceStream() -> decodeStream() -> nativeDecodeAsset()
و در غایت به ()newNonMovableArray میرسد. مستندات این اسلوب اینگونه اعلام می‌نمایند که:

این اسلوب یک آرایه اختصاص‌یافته در یک سود از هیپ جاوا رجوع می دهد که هیچ زمان جابجا نخواهد شد. اسلوب آیتم اشاره برای پیاده‌سازی اختصاص‌های نیتیو روی هیپ جاوا مانند DirectByteBuffers و Bitmaps به کارگیری میگردد.

از این رو می توانیم فیض بگیریم که مصرف بالای خاطر آرایه‌های بایت ناشی از استعمال از اسلوب ()nativeDecodeAsset میباشد.

در واقع هر توشه که ما ()BitmapFactory.decodeResource را فراخوانی می کنیم، یک دفعه تازه از یک شیء بیت‌مپ ساخت و ساز می‌گردد و از این رو داده‌های آرایه بایت جدیدی اضافه میشوند. درصورتی که بتوانیم فراوانی احضار ()BitmapFactory.decodeResource را کاهش دهیم خواهیم توانست از نیاز به اختصاص یاد بیشتر دوری کنیم و از این رو از حادثه Garbage Collection بکاهیم.

1class LessNumerousGCRecyclerViewAdapter(private val context: Context,
2 private val numbers: List): RecyclerView.Adapter() {
3
4 val bitBitmap = BitmapFactory.decodeResource(context.resources, R.drawable.big_bitmap)
5 val smallBitmap = BitmapFactory.decodeResource(context.resources, R.drawable.small_bitmap)
6
7 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NumerousGCViewHolder {
8 val view = LayoutInflater.from(parent.context)
9 .inflate(R.layout.item_numerous_gc, parent, false)
10 return NumerousGCViewHolder(view)
11 }
12
13 override fun getItemCount(): Int {
14 return numbers.size
15 }
16
17 override fun onBindViewHolder(vh: NumerousGCViewHolder, position: Int) {
18 vh.textView.text = position.toString()
19
20 //Reuse bitmap
21 val bitmap = if(position % 2 == 0) bitBitmap else smallBitmap
22 vh.imageView.setImageBitmap(bitmap)
23 }
24}
مشاهده بی نقص کدها
کد فوق ورژن بهبودیافته‌ای از RecyclerViewAdapter میباشد که دفعه‌های بیت‌مپ را صرفا یک توشه ساخت می‌نماید، آنها‌را کش می‌نماید و از این بیت‌مپ‌ها برای imageView در روال ()onBindViewHolder به کار گیری دوباره می‌نماید. به این ترتیب از هر اختصاص خاطر غیرضروری دیگری اجتناب میشود. در‌پی به گراف یاد بعداز این بهبود نگاهی می‌اندازیم.


چنان که میبینید گراف خاطر صاف میباشد و صرفا یک اختصاص برای آرایه بایت وجود دارااست که اندازه آن ناچیز میباشد. در ضمنً نرم افزار در حال حاضر قادر است به صورت خل وچل اسکرول خواهد شد و هیچ نوع گیر کردن فیس نمی‌دهد. بنابراین ایراد یاد را حل کرده‌ایم.


RecyclerView جاری
عده بندی
امید خواهیم داشت با تفحص این راهنما ایده‌ای در خصوص نحوه به کارگیری از ابزار پروفایل کردن برای بررسی اشتباهات عملکردی نرم افزار‌های اندروید به دست آورده باشید. همواره به مصرف یاد در نرم افزار خویش دقت داشته باشید و از اختصاص منابع یاد غیرضروری اجتناب نمائید. کافی میباشد به خیال داشته باشید که مقصود ما این میباشد که گراف مصرف خاطر تا حد قابلیت و امکان مسطح باشد.

نظرات این مطلب

تعداد صفحات : 1

درباره ما
موضوعات
آمار سایت
  • کل مطالب : 795
  • کل نظرات : 0
  • افراد آنلاین : 1
  • تعداد اعضا : 0
  • بازدید امروز : 139
  • بازدید کننده امروز : 1
  • باردید دیروز : 1
  • بازدید کننده دیروز : 0
  • گوگل امروز : 0
  • گوگل دیروز : 0
  • بازدید هفته : 140
  • بازدید ماه : 419
  • بازدید سال : 5098
  • بازدید کلی : 38664
  • <
    پیوندهای روزانه
    اطلاعات کاربری
    نام کاربری :
    رمز عبور :
  • فراموشی رمز عبور؟
  • خبر نامه


    معرفی وبلاگ به یک دوست


    ایمیل شما :

    ایمیل دوست شما :



    کدهای اختصاصی