
Saif Abdo
منذ 2 اسبوع
ما هي ال thread
في موضوعنا النهارده هنتكلم عن ال thread وايه اهميتها ليك كمبرمج اندرويد
في المعني الللغوب للكلمه تعني الخيط وهذا يفسر لنا معناه ايضا في ال java
ال thread هي كلاس بداخلها بعض الmethods التي تساعد وتعمل علي تشغيل كودك في
خيط منفصل
انواع threads وما هي ال ui thread
لل threads انواع وهما ال ui thread و ال worker thread
في اي ابليكيشن في حاجه اسمها ال ui thread و ديه ال thread الاساسيه في برنامج <br>
لو حطينا كود بياخد وقت طويل هتلاقي البرنامج كله هنج وليكن مثلا هنعمل loop <br>
for (long i = 0; i <1000000000 ; i++)
{
Log.d("num",""+i);
}
في loop زي ديه لو حكيتها جوا ال on create في اكتيفتي او حته فرجمنت هتلقي برنامج كله وقف وممكن يخرج كمان ولا يستجيب معاك
ليه ؟ لانك حطيته في ال thread الاساسيه الي هي ui thread
worker thread
طب اي حل ؟ قالك الحل انك هتعمل thread تانيه وديه بنسميها worker thread
ديه هتحط الكود جواه وبكده هيشتغل في thread منفصله عن ال ui thread وتسيبه مع نفسه بقي
// مثال علي ال worker thread
Thread thread = new Thread()
{
@Override
public void run() {
super.run();
// هنا كود ال for يحل مكان الكود الذي سوف ياخذ وقت طويل
for (long i = 0; i <1000000000 ; i++) {
Log.d("num",""+i);
}
}
};
thread.start();
طب كده يبقي انت كا مبرمج اندرويد عرفت نوعين مهمين في ال threads الي انت هتشتغل بيهم
هما
ui thread هي ال thread الاساسيه التي توجد في ابليكيشن
ال worker thread هي الthread التي تعمل بشكل منفصل عن الthread الرئيسيه
thread.sleep
هي طريقه لاخماد او تنويم ال thread التي بداخلها لبعض الوقت التي يقاس بميلي سكند
نستنتج من هذا الكلام انها اذا كانت موجوده بداخل ال ui thread سوف تقوم بتنويم ال ui thread
وكذلك اذا كانت موجوده بداخل ال worker thread
try {
Thread.sleep(10000);
} catch (InterruptedException e)
{
e.printStackTrace();
}
طرق التواصل بين ال threads
دلوقتي فهمنا ال ui thread و worker thread
بس معرفناش طرق التواصل بينهم
في تلت طرق لتواصل بين ال threads
ثواني ثواني هو اصلا ال thread مش بيتواصلو مع بعض ؟
نعم . لان احنا قولنا في الاول ال thread ما هو الي خسط منفصل بيشغل لوحدو مع نفسه
فا لازم يكون في طرق لتواصل بين ال ui thread و worker thread
مثال عشان تفهم اكتر
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textview);
}
Thread thread1 = new Thread()
{
@Override
public void run() {
super.run();
for (int i = 0; i <5 ; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
textView.setText(i+"");
}
}
};
thread1.start();
هنا ال texview جايه من uithread
لما حطينها جوا ال worker thread اي الي هيحصل
للاسف الشديد هيحصل Exception
لان زي ما احنا قولنا مفيش تواصل بين ال threads
طب خلاص انا كده فهمت قولي بقي الطرق الي هتخليني اتواصل ما بين ال threads كويس
run on ui thread
ال run on ui thread ديه ميثود بتساعدنا اننا نشغل كود من ال worker thread الي ui thread
زي مثلا مثال ال text view ده
ال text view ديه موجوده في ui عايزين نشغلها بقي جوا ال worker
فا هنبدا نستغل الميثود ديه
مثال
Thread thread1 = new Thread()
{
@Override
public void run() {
super.run();
for (int i = 0; i <5 ; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// طب ليه يا سيف هنا طلب من اني اعرف متغير تاني من متفير الاولاني واخليه فينال لانك بتستخدم متفير من interface ل interface تاني
final int finalI = i;
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setText(finalI +"");
}
});
}
}
};
thread1.start();
post & post delayed
الطريقه التانيه لتواصل بين threads هي طريقه ال post
هنا انت بتجيب ال view الي متعرف في ui thread وهتقولو post
يعني اي برده مش فاهم
بص وليكن هنقول كده
textview.post
كده معنها ان احنا جبنا ال view الي هو textview وقولنا post يعني انه تبعت الكود الي هو textview ل thread الاساسيه الي كان موجود فيها
طب اي بقي معني ال post delayed
هي هي نفس المعني ولاكن الفرق انك بتتحكم في وقت يعني ممكن متخلهوش يبدا في ساعتها لا يتاخر ثانيه ثانيتين عشر ثواني براحتك
Thread thread1 = new Thread()
{
@Override
public void run() {
super.run();
for (int i = 0; i <5 ; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// طب ليه يا سيف هنا طلب من اني اعرف متغير تاني من متفير الاولاني واخليه فينال لانك بتستخدم متفير من interface ل interface تاني
final int finalI = i;
// طريقة ال post
textView.post(new Runnable() {
@Override
public void run() {
textView.setText(finalI+"");
}
});
// طريقة ال post delayed
textView.postDelayed(new Runnable() {
@Override
public void run() {
}
},2000);
}
}
};
thread1.start();
هنكتفي بمقدار ده دلوقتي وهنكمل الطريقه التالته في منشور قادم لانها كويله شويه وهنستخدم فيها كلاس ال handler
بعدين هنشرح شوية تفاصيل اكتر عن ال thread زي ال wait و notify وغيره
وهنتكلم عن ال synchronizition عشان مهمه في ال threads وسلام عليكم