PDA

View Full Version : مشکل با AsyncTask



commanderdawin
سه شنبه 30 تیر 1394, 14:57 عصر
سلام
می خواستم در background برنامه در یک حلقه while(true در بازه های زمانی مشخص به وسیله یک AsyncTask در یک imageview تصاویری را نمایش بدهم اما برنامه خطایی می دهد با این عنوان که در متد doinbackground امکان دسترسی به view ها وجود ندارد و باید این کار با متد onpreexecute انجام شود که وقتی در آن حلقه ی بینهایت قرار می دهیم برنامه هنگ می کند از thread هم استفاده کردم همین مشکل را با حلقه بی نهایت دارند حالا سوال اینه که چطور یک حلقه بینهایت در اندروید تعریف کنیم که توانایی تغییر خاصیت view ها را داشته باشد اما باعث هنگ کردن برنامه و متوقف شدن آن نشود
متشکرم

NeoFighT
سه شنبه 30 تیر 1394, 19:21 عصر
سلام ،
توصیه میکنم هر کلاس یا هر چیزی که میخواید ازش استفاده کنید ، حد اقل یکم مطالعه کنید در بارش،
حالا من تا جایی که بتونم کلاس AsyncTask رو براتون توضیح میدم.
کلاس AsyncTask برای کار های طولانی که میخواید داخل background انجام بشه و Thread اصلی رو اشغال نکنه استفاده میشه (یعنی از یک Thread جداگانه استفاده میکنه) و سه تا تابع اصلی داره که میتونید پیاده سازی کنید (به اسم های onPreExecute , doInBackground , onPostExecute ) که فقط doInBackground اجباریه و اون دوتای دیگه اختیاریه ،
-تابع onPreExecute وقتی اجرا میشه که AsyncTask هنوز داخل Thread اصلی برنامه (Main Thread) هستش و هنوز وارد Thread جدید نشده و از این تابع برای انجام کار هایی که لازم دارید قبل اجرا شدن عملیاتتون اجرا بشه استفاده میشه و چون هنوز به Thread جدید نرفته میتونید View های برنامه تون رو تغییر بدین بلا فاصله که این تابع تموم شد ، تابع بعدی run میشه.(بیشتر از این تابع برای نمایش دادن یک Dialog به کاربر استفاده میشه)
-تابع doInBackground این تابع دقیقا وقتی ران میشه کار تابع onPreExecute تموم بشه و وقتی برنامه میاد doInBackground همونطور که از اسمش پیداس در Background اجرا میشه (یعنی یک Thread جدید میسازه) و وقتی که Thread جدید ساخته میشه شما نمیتونید به صورت مستقیم به View هاتون دسترسی داشته باشید (چون View ها در Thread اصلی ساخته شدن و شما داخل یک Thread دیگه هستین.)
- تابع onPostExecute این تابع هم دقیقا وقتی که doInBackground تموم شد اجرا میشه و وقتی این تابع اجرا میشه ، برمیگردیم به Thread اصلیمون و اون Thread جدید که ساخته شده بود تموم میشه.با استفاده از این تابع میشه فهمید که عملیاتمون دقیقا کی تموم شده و dialog ای که باز کردیم رو میتونیم اینجا ببندیم و میتونیم به همه View هامون دسترسی داشته باشیم چون دوباره برگشتیم به Thread اصلی.

حالا برای اون کاری که گفتین ForceClose میده چندتا راه حل وجود داره یکیشون رو برات توضیح میدم.
اگه AsyncTask تون داخل یک اکتیویتی اجرا میشه ، اکتیویتی یک تابع داره به اسمه runOnUiThread یک پارامتر داره که یک Runnable باید بهش بدین ،
شما وقتی داخل doInBackground هستین و میخواید به یک View دسترسی داشته باشید باید از این تابع استفاده کنید ، همونطور که از اسمش پیداست میاد کدی که داخلش مینویسید رو داخل Thread اصلی برنامه (که View ها در اون قرار دارن) اجرا میکنه.(دستم خسته شد DD: )
مثلا هرجا که لازم دارید به این صورت استفاده کنید :

runOnUiThread(new Runnable() {
@Override
public void run() {
myView.setText("Sallam");
}
});

commanderdawin
سه شنبه 30 تیر 1394, 20:37 عصر
دمت گرم دستت درد نکنه

majid183000
پنج شنبه 19 شهریور 1394, 12:12 عصر
سلام.من دوتا کلاسAsyncTask دارم.متاسفانه فقط یکی از این کلاس ها اجرا میشه ومتد کلاس دوم doInBackground اجرا نمیشه.
یکی از کلاس ها کارش چک کردن یوزروپسورد هستش و دومی مربوط به ثبت اطلاعات در دیتابیس.کلاس دومم که ثبتنام هستش اصلا اجرا نمیشه.

iran_sun99
پنج شنبه 19 شهریور 1394, 12:19 عصر
دوست عزیز برداشتی که از حرفات کردن اینکه اگر دوتا asyntask داشته باشی و یکی رو تو doinbackground دیگری خواسته باشی اجرا کنی یاید خط قبل از فراخوانی تابع این خطو اضافه کن
looper.mylooper() البته property دیگری هم دارد ولی تا جایی که یادم هست همین گزینه اگر جواب نداد از property دیگش استفاده کن