• 0
com.jkelany

الدرس الثالث - نبذة سريعة عن ال Java ME

سؤال

السلام عليكم ورحمه الله وبركاته

اولا احب اهنأ اخويا وحبيبى " محمد عرسان " باشرافه فى المنتدى 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

لو فكرنا فى الموضوع

نجد ان الطرق الثلاثه متشابه تشابه كبير

هذا هو الكود الخاص بالثلاث طرق للتحميل

TimeMobileAppWithThread.zip

TimerMobileAppWithRunnable.zip

TimeMobileAppWithTimeTask.zip

اتمنى ان اكون شرحت بطريقه كويسه ومفهومه

ويكون الغرض من الدرس قد تم تحقيقه

سلام عليكم

2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

15 إجابة على هذا السؤال .

  • 0

رائع يا محمود..درس ممتاز جدا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

رائع يا محمود..درس ممتاز جدا

الله يخليك اخى مهدى

ربنا يخليك يارب

الحمدلله انه كويس

ان شاء الله القادم

احتمال يكون Connection Streams

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

درس جميل يا محمود ويصلح عن Thread

بدون أي علاقة له مع JavaMe

افكر بتعديله والاستيلاء عليه لصالح قسم الجافا الرئيسي :lol:

بالمناسبة ما هو الفرق الذي تتحدث عنه هنا؟

لكن قد يتسائل ما الفرق بين الاثنين

تفرق فى عمليه الـ multi threading

لكن ليس وقتها حاليا

تحياتي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

درس جميل يا محمود ويصلح عن Thread

بدون أي علاقة له مع JavaMe

افكر بتعديله والاستيلاء عليه لصالح قسم الجافا الرئيسي :lol:

بالمناسبة ما هو الفرق الذي تتحدث عنه هنا؟

تحياتي

الله يخليك يا عموو علاء

طبعا هو يعتبر ليس له علاقه قويه بالـ ME لكنه طبق على مثال ME يقبى خلاص هو الوريث الشرعى له :lol: :lol: :lol:

وتعدله ليه بس اعملك واحد هناك يا حاج انت تامر

الفرق الذى اتحدث عنه

هو ان عندك برنامج يتعامل مع multi threads

وفيه جزء مش عاوز الـ multi threads

فى هذه الطريقه تجعله يعمل implement للـ Runnable interface

يقبى هو كدا شغال على thread واحد بس :wub:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

جمييل يا محمود..

بدأت أحب ال ME بنسبة 30% يا مسهل الحال ....

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

جمييل يا محمود..

بدأت أحب ال ME بنسبة 30% يا مسهل الحال ....

ربنا يخليك يا هويدى

ان شاء الله تحبها وتشتغل فيها باذن الله بنسبه 100%

ان شاء الله

ولن ابخل باى حاجه اعرفها ان شاء الله

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

جمييل يا محمود..

بدأت أحب ال ME بنسبة 30% يا مسهل الحال ....

لا كثير الله يسامحك ليش مغلب حالك كان خليتها 10% :mad:

بصراحة ال JME تعتبر تحدي لكل المبرمجين بما فيها محدودية للموارد :cool:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

لا كثير الله يسامحك ليش مغلب حالك كان خليتها 10% :mad:

بصراحة ال JME تعتبر تحدي لكل المبرمجين بما فيها محدودية للموارد :cool:

ماشي براحه ليه دا ثالث درس 30%

يقبي هو عاوز كدا 10 دروس

كل درس ب10%

بس يعني ايه تحدي للمبرمجين بما فيها محدوديه للموارد

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

اسف جدا

هذا الرد غلطه من عندى

لانى كنت على الموبيل ومش اخدت بالى

ارجوا حذف هذا الرد من قبل المشرفين

وشكرا

تم تعديل بواسطه Mahmoud Kelany
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

اقرأ هذه المقولة لمبرمج JME

Programming J2ME is a very tricky business, much more so than regular desktop programming. Because you have limited resources, most of the time you simply don’t have the luxury of wasting them. Granted, sometimes you can get away with using RAM and CPU cycles like there’s no tomorrow, but any serious number-crunching in J2ME requires you to be a really, really clever coder. You have to use all the tricks you’ve got : clever memory allocation techniques, clever ways of speeding up your computations, clever ways of storing your data, even clever ways of displaying information. Not to mention you have to handle device-specific issues, of which there are a lot. There’s no question about it, J2ME programming can be (and often is) difficult, inconsistent and perplexing.

So why do I love it ? Well, plenty of reasons. It always keeps me thinking while I work. It doesn’t allow me to get rusty, because I always have to tackle new challenges and learn new tricks. It gives me the satisfaction of literally holding my work in the palm of my hand. It makes me feel great because I can create some very cool stuff despite the very restrictive environment. It fuels my imagination, because J2ME means computer programs that you can carry around and use wherever you are. Last but certainly not least, it makes me feel like a real programmer (without the convoluted and hieroglyphic-like coding style).

Why do you love (or hate) J2ME ?

المصدر

تم تعديل بواسطه محمد عرسان
تعديل الرابط
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
بصراحة ال JME تعتبر تحدي لكل المبرمجين بما فيها محدودية للموارد
blush.gif

عادي يا أخي,,,, أنا لما هفكر في موبايل, موش هفكر في ME :P

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

اقرأ هذه المقولة لمبرمج JME

المصدر

جميل اخى محمد

فعلا كلام رائع

اللى يعرف يستخدم ويوظف المصادر المحدوده دى فى البرامج بتاعته

بحيث انه يستفيد بيها اكيد هيكون عبقرى :)

جميل

حياك الله على هذه الكلمات اللتى تعطى الدفعات اللى الامام

جزاكم الله خيرا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

لك مني جزيل الشكر اخ Mahmoud Kelany

اتمنى ان تواصل ابداعك

منور المووضوع

ان شاء الله :)

ربنا يسهل بس

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

جزيل الشكر لك في إنتظار المزيد إن شاء الله :)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .