PDA

View Full Version : نحوه صحیح dispose کردن view ها



biodread
دوشنبه 13 خرداد 1392, 19:20 عصر
سلام
فرض میکنیم که ما دارای activity هستیم که در خود مقدار زیادی بچه (view) دارد
و ما میخواهیم موقع ای که تابع onDestroy صدا زده شد تمامی بچه ها remove بشن

من تابع ای نوشتم که همین کار را میکند اما از درست کار کردنش مطمئن نیستم

آیا در eclipse پروفایلی هست که بشه به نحوه تولید و یا از بین رفتن view ها نظارتی داشت مثل time profile در flex که برنامه ای برای فلش هست
درضمن flex یکی از پلاگین های eclipse هست

آیا شما شیوه ای درست برای انجام این کار دارید؟

مرسی

تابع dispose من


private void dispose()
{
for (int i = 0; i < bioFlowLayout.getChildCount(); i++)
{
((BioMusaic) bioFlowLayout.getChildAt(i)).setOnClickListener(nu ll);
((BioMusaic) bioFlowLayout.getChildAt(i)).dispose();
}
bioFlowLayout.removeAllViews();

HorizontalScrollView metroHorizontalScrollView = (HorizontalScrollView) this.findViewById(R.id.metroHorizontalScrollView);
metroHorizontalScrollView.removeAllViews();

ScrollView metroverticalScrollView = (ScrollView) this.findViewById(R.id.metroVertivalScrollView);
metroverticalScrollView.removeAllViews();

RelativeLayout metroRelativeLayout = (RelativeLayout) this.findViewById(R.id.metroRelativeLayout);
metroRelativeLayout.removeAllViews();

bioFlowLayout = null;
metroHorizontalScrollView = null;
metroverticalScrollView = null;
metroRelativeLayout = null;

sizeArray = null;

bioDataParser.addEventListener(null);
bioDataParser.dispose();
bioDataParser = null;

MainActivity.STATIC = null;

xml.clear();
xml = null;

Log.d("dispose shod dadash", "nn");
}

Modernidea
سه شنبه 14 خرداد 1392, 19:01 عصر
سلام

وقتی تابع OnDestroy فرا خوانی شد، دیگر لازم نیست به فکر Dispose کردن View های درون آن باشید.

بررسی Application LifeCyle (http://developer.android.com/reference/android/app/Activity.html) جواب کاملتری میدهد.

اگر به لینک بالا مراجعه کنید، میبینید بعد از اینکه Activityای تخریب شد، اگر قصد اجرای دوباره آن را داشته باشید، رویداد OnCreate مربوط به Activity دوباره فراخوانی شده و همه کاراها از دوباره انجام میشود.

اما!

ظاهرا گاهی اوقات با اینکه اکتیویتی بسته(Finish) میشود، برخی منابع مربوط به آن باعث جلوگیری کردن از آزاد شدن کامل آن میشود. درنتیجه تابعی که شما نوشته اید، تابع مفیدی است ولی نیاز به تغییر کوچکی دارد و
طبق پاسخ موجود در این پست (http://stackoverflow.com/a/5041803/478162)، گاهی اوقات Linstener هایی که به برخی منابع اشاره دارند موجب بروز مشکل ذکر شده میگردند و نیاز است که آن ها را unregister کرد.
بهتر است که عمل unregister کردن در onPause و عمل Register کردن در onResume تعریف شود.

لینک ذیل در مورد کارایی بهتر جهت برنامه نویسی اندروید توضیح داده است:
http://developer.android.com/training/articles/perf-tips.html

این لینک نیز ویدئویی در مود مدیریت حافظه است: (لینک اول مربوط به یوتیوـب و لینک دوم، را آپلود کردم و فقط شش روز اعتبار دارد)
http://www.youtube.com/watch?v=_CruQY55HOk
http://fs2.filegir.com/chat/Google_I_O_2011__Memory_management_for_Android_App s_%5Btag18%5D.mp4

موفق باشید.

biodread
سه شنبه 14 خرداد 1392, 20:01 عصر
بسیار ممنون
متوجه شدم

همونطور که گفتی موفع ای که تابع onCreate صدا زده میشه همه چی دوباره ساخته میشه
ولی آیا این درسته؟
منظورم اینه من گفتم وقتی یک بار ساخته میشه چرا باید دوباره ساخته شه
اومدم مقدار savedInstanceState رو برسی کردم گفتم اگه دیگه نال نبود از مواردی که در مموری نگه داشنم استفاده کنه
اما انگار این کار درست نیست چون مموری رو اشغال میکنم تا cup usage نداشته باشم و اگه مقادیرم رو در مموری نگه ندارم مجبورم هر سری بسازم شون

به نظر شما cpu مهمتره یا memory؟
منظورم از memory همون ram گوشی هست

biodread
سه شنبه 14 خرداد 1392, 20:04 عصر
پست بالا دوبار زده شده بود
هرچه قد که گشتم نتونستم دکمه حذف رو پیدا کنم

Modernidea
سه شنبه 14 خرداد 1392, 22:59 عصر
سلام، خواهش میکنم،



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

105124

پس شما نباید نگران این باشید که چرا باید هر دفعه همه چیز را دوباره بسازم، این چیزی است که خود اندروید میخواهد و این را بهترین راه میداند.



به نظر شما cpu مهمتره یا memory؟
به نظر من، هر دو!
اگر پردازشی بیشتر از 1 یا 2 ثانیه طول بکشد، اندروید آن پردازش را از بین میبرد!
اگر برنامه ای تقریبا همه فضای حافظه را بگیرد، اندروید برنامه را بدون اجازه میبندد!
پس هردو به نحوی مهم اند.

موفق باشید.

Modernidea
سه شنبه 14 خرداد 1392, 23:33 عصر
درضمن این را هم بگم که، SavedInstanceState آبجکتی را در حافظه ذخیره نمیکنه.
فقط برخی اطلاعات مورد نیاز را ذخیره میکند و تا زمانی ماندگار است که برنامه بسته نشده باشه.


As your activity begins to stop, the system calls onSaveInstanceState() (http://developer.android.com/reference/android/app/Activity.html#onSaveInstanceState%28android.os.Bun dle%29) so your activity can save state information with a collection of key-value pairs. The default implementation of this method saves information about the state of the activity's view hierarchy, such as the text in an EditText (http://developer.android.com/reference/android/widget/EditText.html) widget or the scroll position of a ListView (http://developer.android.com/reference/android/widget/ListView.html).

منبع (http://developer.android.com/training/basics/activity-lifecycle/recreating.html)

موفق باشید.