السلام عليكم ورحمه الله وبركاته
اولا احب اهنأ اخويا وحبيبى " محمد عرسان " باشرافه فى المنتدى Java ME
ثانيا فى سلسله نبذه سريعه عن الـ Java ME
اليوم سوف نتكلم عن استخدام الـ Thread , TimerTask , Runnable interface
ازاى دا يحصل
هيكون معانا مثال نستخدم فيه الحاجات دى
الموضوع اننا هنعمل نظام ساعه يتم تحديثها كل ثانيه
فذلك يتم عن طريق ثلاث طرق
وهيا استخدام الـ Thread
او استخدام الـ Runnable interface
او استخدام الـ TimerTask
هيا بنا نتكلم عن كل طريقه بالتفصيل ان شاء الله
ولكن هناك جزء مشترك هو انشاء شاشه تحتوى على StringItem
لعرض الساعه
و ImageItem
صوره يتم اضافتها فقط كرمز ولكنها لا تعمل
هيا نقوم بانشاء الشاشه التى تحتوى على هذه العناصر
public Form getMainForm() {
if (mainForm == null) {
try {
//Forms
mainForm = new Form("Time");
//Items
timeLable = new StringItem("", "H:M:S");
imageLable = new ImageItem("", Image.createImage("/time/time.png"), ImageItem.LAYOUT_CENTER, "");
mainForm.append(timeLable);
mainForm.append(imageLable);
//Commands
exitCmd = new Command("Exit", Command.EXIT, 0);
mainForm.addCommand(exitCmd);
mainForm.setCommandListener(this);
} catch (IOException ex) {
ex.printStackTrace();
}
}
return mainForm;
}الجديد فى الكود هو كيفيه انشاء صوره
لكن الباقى تم شرحه مسبقا فى الدروس السابقه
ويتم انشاء الصوره
هكذا
imageLable = new ImageItem("", Image.createImage("/time/time.png"), ImageItem.LAYOUT_CENTER, "");فالبناء الخاص بالـ ImageItem
ياخذ القيم التاليه بالترتيب
1- يأخذ الـ lable على الصوره
2- وبعد كدا ياخذ الصوره نفسها
3- ياخذ مكان الصوره فى الشاشه
4- ياخذ النص الذى يظهر على الصوره
كما ذكرنا فى البناء انه ياخد الصوره ولكن كيف
هكذا
Image.createImage("/time/time.png")هى تختلف عن الـ Java SE
فهنا نقوم باستخدام الـ Image class
ونستدعى الداله
createImage
التى تاخذ مسار الصوره
وايضا الـ CommandListener
كما شرحناها قبل ذلك
هذا هو الكود الخاص بها
public void commandAction(Command cmd, Displayable d) {
if (cmd == exitCmd) {
notifyDestroyed();
}
}هذه الداله هي الخاصه بامر الخروج كما ذكرنا من قبل
notifyDestroyed();
ناتى الى الجديد فى الموضوع
وهى كيفيه اجلاب الوقت من الموبيل وعرضه وتحديثه
يتم اجلاب الوقت من الـ Calendar Class
وسوف نوضح كيف يتم ذلك
لكن نوضح فقط كيف يتم تحديث الوقت كل مره
وهى انه يتم استخدام احد من الثلاثه اختيارات التى تم ذكرها من قبل
Thread , TimerTask , Runnable
دعنا نشرح كيفيه جلب الوقت من الموبيل
calendar = Calendar.getInstance(); calendar.setTime(new Date());
نقوم بانشاء كائن من الكلاس Calendar
ونقوم باعاده ضبط الوقت باستخدام الداله
setTime(new Date());
واعطائه تاريخ جديد
طب نجلب الساعات و الدقائق و الثوانى ازاى ؟
نستخدم الداله get(…)
من الكائن calendar
calendar.get(Calendar.HOUR) calendar.get(Calendar.MINUTE) calendar.get(Calendar.SECOND)
وبعد ذلك نقوم باعاده الكتابه على ال timeLable
الذى عرفناه من قبل الذى هو من نوع StringItem
لكن هذا يتم تكراره مره واحده
طب تقولى هاعمله فى loop ازاى بقا
هيتكرر ازاى و لا الloop دى هتكون تكرر كام مره ؟
طبعا هنحتاج الى اللجوء الى هدف الدرس
اولا طريقه الـ Thread
private void timeThread() {
new Thread() {
public void run() {
while (true) {
try {
calendar = Calendar.getInstance();
calendar.setTime(new Date());
String time = ("Time (H:M:S) " + calendar.get(Calendar.HOUR) + ":" + calendar.get(Calendar.MINUTE) + ":" + calendar.get(Calendar.SECOND) + " ");
if (calendar.get(Calendar.AM_PM) == 1) {
time += "PM";
} else {
time += "AM";
}
timeLable.setText(time);
sleep(1000);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
}.start();
}
}وهى انشاء داله تحتوى على Thread
يحتوى على الاوامر الذى تستخدم فى اعاده ضبط الوقت
كيفيه عمل الخيط
هى عمل
new Thread(){
}.start();ولكن لابد من انشاء الداله المسئوله عن عمليه التشغيل
وهى الداله
run()
ويتم كتابه الكود المسئول عن التحديث بداخلها
كما هو موضح فى الكود مسبقا
وبعد ذلك يتم استدعاء هذه الداله بعد ظهور الشاشه الرئسيه
public void startApp() {
Display.getDisplay(this).setCurrent(getMainForm());
timeThread();
}لمزيد من التفاصيل عن الخيوط
http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Thread.html
ثانيا طريقة الـ Runnable interface
نقوم باعمل implement
هكذا
public class TimerRunnableMidlet extends MIDlet implements CommandListener, Runnable {
}للـ Runnable interface
وعندها يوجد هناك الداله الخاصه بالتشغيل
اللى هى داله
run ()
فلابد من وجودها
ونقوم ايضا بكتابه الكود الخاص بتحديث الوقت داخلها
وبعد ذلك نقوم باستدعاء عمل الداله run()
لكن لا يمكن استدعائها هكذا
لابد من عمل thread
الذى ياخذ فى البناء الخاص به
Runnable
الذى يكون فى حالتنا هذه هو this
لانه هذه الكلاس تحتوى على
Runnable interface
هكذا
public void startApp() {
Display.getDisplay(this).setCurrent(getMainForm());
new Thread(this).start();
}لكن قد يتسائل ما الفرق بين الاثنين
تفرق فى عمليه الـ multi threading
لكن ليس وقتها حاليا
لمذيد من المعلومات حول
Runnable interface
http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Runnable.html
الطريقه الثالثه والاخيره
وهى استخدام الـ Timer , TimerTask
نقوم بانشاء كائن من نوع TimerTask
الذى يستوجب ايضا انشاء داله run()
التى يكتب بداخلها نفس الكود الخاص بالتحديث
private void timerTaskThread() {
TimerTask timerTask = new TimerTask() {
public void run() {
while (true) {
calendar = Calendar.getInstance();
calendar.setTime(new Date());
String time = ("Time (H:M:S) " + calendar.get(Calendar.HOUR) + ":" + calendar.get(Calendar.MINUTE) + ":" + calendar.get(Calendar.SECOND) + " ");
if (calendar.get(Calendar.AM_PM) == 1) {
time += "PM";
} else {
time += "AM";
}
timeLable.setText(time);
}
}
};
Timer timer = new Timer();
timer.schedule(timerTask, 0, 1000);
}
}وبعد ذلك نقوم بانشاء كائن من النوع Timer
وبعدها نستدعى الداله schedule(…)
على الكائن الذى من النوع Timer
وتاخذ القيم التاليه بالترتيب
timerTask الذى تم تعريفه من قبل
وتاخد مده التاخير فى عمل الكود بالملى ثانيه
وتاخذ اخر قيمه هي مده تكرار هذا الكود كل كام ملى ثانيه ؟؟
وبعد ذلك نستدعى الداله اللتى تحتوى على ال Timer , TimerTask
بعد ظهور الشاشه الرئيسييه
public void startApp() {
Display.getDisplay(this).setCurrent(getMainForm());
timerTaskThread();
}لمزيد من المعلومات عن الـ Timer , TimerTask
http://download.oracle.com/javase/1.4.2/docs/api/java/util/TimerTask.html
http://download-llnw.oracle.com/javase/1.5.0/docs/api/javax/swing/Timer.html
لو فكرنا فى الموضوع
نجد ان الطرق الثلاثه متشابه تشابه كبير
هذا هو الكود الخاص بالثلاث طرق للتحميل
TimerMobileAppWithRunnable.zip
اتمنى ان اكون شرحت بطريقه كويسه ومفهومه
ويكون الغرض من الدرس قد تم تحقيقه
سلام عليكم


