مشکل در thread
سلام.دوستای عزیز من در یک اکتیویتیم که تمام اکتیویتیام به اون extends شدن یک thread دارم که قرار یک متغیرو در فواصل زمانی 60000 میلی ثانیه اجرا کنه در ضمن چند thred دیگر در اکتیویتیای دیگر، همزمان در حال اجرا هستن.مشکل اینجا است که بعد از یک دقیقه که thread باید یک بار اجرا بشه و به متغیر یکی اظافه کند در بعضی مواقع 3 تا و در بعضی مواقع 4 تا و همین جور متغیر به مقداری که میخوام اظافه میکنه.اگه دوستان میدونن دلیل این کار و رفع این مشکلو به من بگن.خیلی خیلی مهمه.
import android.os.Handler;
public class Mind extends V {
public static Handler handler1 = new Handler();
@Override
protected void onCreate(android.os.Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mydate = "" + year + "/" + mon + "/" + day + "" + hor + ":ساعت";
Thread hour = new Thread(new Runnable() {
@Override
public void run() {
do {
try {
Thread.sleep(60 * 1000);
handlerpostmind();
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
while (true);
}
});
hour.start();
};
public void handlerpostmind() {
Mind.handler1.post(new Runnable() {
@Override
public void run() {
getdaramad();
}
});
}
public void getdaramad() {
if (hor <= 24) {
hor += 1;
}
if (hor >= 24) {
day = day + 1;
hor = 1;
}
if (day >= 30) {
mon = mon + 1;
day = 1;
}
if (mon >= 12) {
year = year + 1;
mon = 1;
}
mydate = "" + year + "/" + mon + "/" + day + "" + hor + "ساعت";
}
}
مهدی جوون فکر کنم مشکلت اینه
فرض کن یک Activity داری که بقیه رو از اون extends کردی ، در همین اکتیویتی والد ، یک ترد ساختی و اون رو Start کردی ! ، خوب با این تفاسیر هر بار که شما بگی این Thread یک نمونه از اون Thread پدره یک بار اون ترد شروع به اجرا میکنه ! پس اگه یک لاگ داخل اون Thread بزاری و Thread ID رو چاپ کنی ، میبینی که 4 تا Thread در حال انجام کار هست :(
برای حل مشکلت ، Thead رو public static تعریف کن و هرجایی نیاز به اجرایThread داری Parent.myThread.start()z کن !
فکر کنم متوجه شده باشی داستان چیه !
فرض رو بر این بگیریم ، قصد داریم در برنامه 60 متغییر رو به عنوان تایمر در نظر بگیریم ! که هر کدوم در تایم خاصی شروع متوقف یا از سر گفته میشه ! ، خوب به نظرت باید 60 تا ترد بنویسیم ؟! شاید خیلی ها بگن آره ولی من میگم نه ! ، فقط یه ترد میخوایم
1- یک ساختار برای هر زمان ایجاد میکنیم
public class Struct {
public int id;
public int CurrentValue;
public Boolean RunThread;
}
خوب پس فقط کافیه یه Adapter براش بنویسیم که بصورت زمانبندی شده این ها رو بروز کنه و این کار رو یک ترد برای ما انجام میده
final ArrayList<Struct> items = new ArrayList<Struct>();
items.add(...);
items.add(...);
items.add(...);
Thread adapterThread = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
for (Struct item: items) {
if (item.RunThread) {
item.CurrentValue++;
}
}
try {
Thread.sleep(1000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
});
adapterThread.start();
پس چیز بدرد بخوری میشه D:
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .