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

ایجاد تاخیر در هر بار اجرای حلقه for

vahid  10 سال پیش  10 سال پیش
0 0

با سلام

من تو برنامم یه آرایه از imageview ها دارم که میخوام هر کدوم به ترتیب یه تصویر رو نشون بدن که این عمل رو انداختم توی یه حلقه for تا برای هر کدوم از imageview ها یک بار اجرا بشه (تا اینجا مشکلی نیست)

فقط مشکل اینه که میخوام بین اجرای هر کدوم از حلقه های for مذکور یه وقفه (مثلا 100 میلی ثانیه) ایجاد بشه.یعنی وقتی یکی از imageview ها تصویر رو نشون داد imageview بعدی بعد از 100 میلی ثانیه تصویر خودش رو نشون بده و ...                               و بعد از تموم شدن کامل حلقه for کدهای بعد از for اجرا بشن.

تشکر از راهنماییتون

منظورم یه چیزی شبیه اینه :


 for(int i=0; i<10;i++){
imageviewArray.get(i).setimageResource(image);

ایجاد وقفه 100 میلی ثانیه;
}
0 0
باید از thread استفاده کنید، چون تصمیم دارید به صورت همزمان cpu درگیر دو یا چند کار بشه. این مبحث به صورت واضح و کاملا اجرایی در بخش نهم با عنوان "برنامه نویسی همزمانی" تدریس شده است. (10 سال پیش)
0 0
با تشکر از راهنماییتون مساله اینجاست که من نمی خوام هیچ چیزی هم زمان اجرا بشه .یعنی برنامه با قسمت وقفه هم همانند دیگر قسمت های برنامه برخورد کنه یعنی imageview اول مقداردهی بشه و بعد 100میلی ثانیه کل برنامه ایست کنه و بعد imageview دوم مقداردهی بشه و دوباره برنامه 100 میلی ثانیه ایست کنه و الی آخر ... کدهای بعد از حلقه for هم تا زمانی که همه imageview ها مقداردهی نشدن اجرا نشه. امیدوارم منظورمو درست رسونده باشم از thread ها هم استفاده کردم و داخل thread ام 100 میلی ثانیه وقفه دادم ولی برنامه اصلی منتظر اجرای کامل thread نمیمونه و کدهای بعد از thread رو اجرا میکنه بعد سعی کردم از متد join استفاده کنم یعنی کد thread.join(); رو گذاشتم تا برنامه اصلی منتظر تموم شدن اجرای thread بمونه ولی در این حالت هم برنامه اصلی تا زمانی که کل for تموم نشه (حتی بین thread ها) هیچ کاری انجام نمیده. (10 سال پیش)
0 0
یاری کننده ای هست مرا یاری کند ... من فقط یه قطعه کد لازم دارم که بین هر اجرای حلقه for باعث بشه کل برنامه (مثلا 100 میلی ثانیه) ایست کامل کنه تاکید میکنم کل برنامه . البته این قطعه کد نباید روی کد های قبل از خودش هم تاثیر بزاره بطور مثال وقتی مینویسیم THread.sleep(); همونطور که میدونید کدهای قبل از خودش رو هم نمیزاره اجرا بشن که من اینو نمیخوام. با تشکر فراوان (10 سال پیش)
 برای این سوال 3 پاسخ وجود دارد.
پاسخ به سوال 
محمد  10 سال پیش
+2 0

سلام از این استفاده کن

 

privatestaticfinallong ANIM_VIEWPAGER_DELAY =3000;
 privateHandler h =newHandler();
 privateRunnable animateViewPager =newRunnable(){@Overridepublicvoid run()
 {if(!pagerMoved){if(pager.getCurrentItem()==pager.getChildCount()){
                    pager.setCurrentItem(0,true);}else
 {
                    pager.setCurrentItem(pager.getCurrentItem()+1,true);}

                h.postDelayed(animateViewPager, ANIM_VIEWPAGER_DELAY);}}};

البته این بخشی از قطعه کد هست ک شاید اصلا متوجه نشید فلذا!

قطعه کد کامل

رو بررسی کنید! جواب دومی ک دادن اونجایی ک گفته

Try this

SlideViewPager.java

امیدوارم به کار شما بیاد (لایک فراموش نشه :) )

0 0
شرمنده میشه یه کم توضیح بدین این کد یعنی چی ؟ از سایت stack هم چیزی سر در نیاوردم. (10 سال پیش)
پاسخ به سوال 
محمد  10 سال پیش
+2 0

ازviewpager برای اسلایدرش استفاده کرده و از ViewFlipper استفاده نکرده حالا من نمیدونم شما از کدوم یکی از اینا استفاده کردید ! اگر از دومی استفاده کردی باید از viewpager استفاده کنی

بعد از کلاس handler یک new گرفته برای کنترل اسلایدرش

بعد باید یک متغیر خصوصی تعریف بکنی

privatestaticfinallong ANIM_VIEWPAGER_DELAY =3000;

و یک مقداری رو بر حسب میلی ثانیه بهش نسبت داده تا زمان تاخییر رو بهش بده

بعد برای این اسلایدر از کلاس

Runnable

یک new زده و دستورات شرططی رو گذاشته ک اگر صفحه یاهمون ویوپیجر فرضا تغییر کرد یکاری بکنه وگرنه یکاری این کلا برای تغییر عکس ها در اسلایدر بود بعد از این دو یعنی if and else داخل کد

 h.postDelayed(animateViewPager, ANIM_VIEWPAGER_DELAY);  

بااستفاده از متغیر h  ک هندلر بود و نیو کرده بود با تابع postdelayed مقدار میلی ثانیه رو همونطور ک میبینی بهش داده ک باعث میشه این تاخیر ایجاد بشه!

h.postDelayed(animateViewPager, ANIM_VIEWPAGER_DELAY);

این کد رو کلا در دو جا به کار برده یکی در onresume یکی در متد run

در

publicObject instantiateItem(ViewGroup container,int position)

هم عکس هاش رو قرار داده

که طبق ای دی ک ارسال میشه بهش مقدار کیس مورد نظر قرار میگیره بجای بک گروند قبلی

در کل شما باید با استفاده از متد

postDelayed

که در کلاس handler وجود داره به اون چیزی ک میخوای برسی  البته ایتم قبلی رو فراموش نکن ک باید با

publicvoid destroyItem(ViewGroup container,int position,Objectobject){// TODO Auto-generated method stub((ViewPager)container).removeView((View)object);

از بین بببری! وگرنه دوعکس همزمان فعال میشن!ک این هم متدی هست از کلاس های موجود و فقط باید اور رایدش کنی

 

0 0
دوست عزیز از راهنماییتون خیلی ممنون ولی من نه از viewpager و نه از viewflipper استفاده نکردم من در قسمت سوال هم نوشتم که یک آرایه از imageview ها دارم که میخوام بین مقداردهی شون چند میلی ثانیه تاخیر بندازم. حالا نمیدونم چه جوری میتونم از توضیحات شما توی کدهام استفاده کنم. (10 سال پیش)
+2 0
بله من دقت نکردم به سوال شما چطوره این رو امتحان کنی (10 سال پیش)
پاسخ به سوال 
محمد  10 سال پیش
+2 0

فرضا یه همچین کدی رو

h.postDelayed(imageviewArray.get(i).setimageResource(image);, ANIM_VIEWPAGER_DELAY);

 البته ورودی هاش postDelayed(Runnable, long) هست

 شاید این بتونه تو این زمینه کمکت کنه site

0 0
اگه درست متوجه شده باشم این کد باعث میشه که handler مقدار رو با تاخیر به خروجی ارسال کنه درسته؟ (10 سال پیش)
+2 0
بله درسته به ورودی هاش توجه کن دوتا ورودی میگیره ک اولی یک رانیبل هست ک باید new کنیش و دومی یک زمان هست درواقع یک عدده حالا اینکه چطور این دورو باهم ترکیب کنی نمیدونم!راهی بود ک به ذهنم رسید البته لازمه بدونی من تو زمینه ی اندروید تازه کارم :) فقط خواستم جواب بدم بلکه کارت راه بیوفته امیدوارم موفق عمل کرده بوده ! باشم :) (10 سال پیش)
0 0
خیلی از راهنماییت ممنون باز دمت گرم که جواب دادی شاید بتونم با این یه کاریش بکنم. تشکر (10 سال پیش)
+2 0
مخلصتیم داداش! فقط لایک یادت نره! :) (10 سال پیش)

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