(Saif Abdo على كودار)
التنبيهات

التنبيهات

0

لا توجد تنبيهات جديدة

ما هي ال 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 وسلام عليكم 


تفاعل 2 شخص مع المنشورة