«

»

Jan 08

Looper

Looper

אייקון - Looper
 

רקע תאורטי:

 

Looper היא מחלקה שמשתמשים בה בשביל להפוך תהליכון רגיל שיצרנו ל Pipeline-Thread. ז.א. שיהיה לו תור ושהוא ירוץ עליו כל פעם.

בשביל להבין מה זה looper, handler, תור הודעות (ה Message Queue) נדבר קצת על תבנית העיצוב Pipeline-Thread:

תבנית זאת נועדה לפתור את ההתמודדות של שליחת משימות שצריכות להתבצע בצורה סינכרונית אחת אחרי השנייה.

לדוגמה: העלאת מספר תמונות לשרת / בקשת מידע משרת אחד אחרי השני.

תבנית העיצוב הזאת ממומשת ע”י תור של הודעות (או אפשר לקרוא להם גם משימות) שתהליכונים אחרים מעבירים לתהליכון הזה, (באופן ספציפי Runnable).

התהליכון עובר כל פעם בלולאה על התור, מושך משימה ומבצע אותה. אם אין לו משימות הוא עושה wait וכאשר תכנס משימה לתור היא תעיר אותו ע”י notify.

 

במאמר זה נדגים איך הופכים תהליכון רגיל לתהליכון Looper.

 
 

דוגמא והסבר:

 

        @Override
	public void run() {

		try {

 

הקריאה ל Looper.prepare עושה את האיתחול בשביל להפוך את התהליכון ל Looper.

		
			Looper.prepare();

 

מגדירים פה את ה Handler ולא בבנאי של התהליכון מכיוון שבחלק הקוד הזה של ה run התהליכון עצמו מריץ את הקוד. ואת הקוד בבנאי מריץ תהליכון המשתמש.

ולכן כעת ה Handler יהיה משוייך לתהליכון שלנו.

			
			_myLooperThreadHandler = new Handler();

 

Looper.loop מתחיל את הפעולה של התהליכון על תור ההודעות שלו.

			Looper.loop();

		} catch (Exception e) {

			Log.e("Text", "Lior: Looper exception", e);

		}

	}

 

כאשר נרצא לסיים את הריצה של התהליכון נקרא ל Looper.quit(), אחרת הרוץ יהיה חיי לעד, גם אם לא יהיו לו משימות בתור ההודעות.

בשביל לדחוף הודעות לתהליכון אפשר להעביר את ה handler או פשוט להחצין מתודה:

public void postTaskToHandler(Runnable runnable) {

		if(_myLooperThreadHandler == null || runnable == null) {

			return;

		} else {

			_myLooperThreadHandler.post(runnable);

		}

	}

 
 

לינק להורדת הפרויקט לדוגמה

 

בהצלחה !

 

Leave a Reply

Your email address will not be published.

אתם יכולים להשתמש באפשרויות ותגי ה-HTMLהבאים: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>