8.3.2 預(yù)約時(shí)間Handler
本節(jié)的例子代碼所在的工程目錄是src\ch08\ch08_handler
android.os.Handler是Android SDK中處理定時(shí)操作的核心類。通過Handler類,可以提交和處理一個(gè)Runnable對(duì)象。這個(gè)對(duì)象的run方法可以立刻執(zhí)行,也可以在指定時(shí)間后執(zhí)行(也可稱為預(yù)約執(zhí)行)。
Handler類主要可以使用如下3個(gè)方法來(lái)設(shè)置執(zhí)行Runnable對(duì)象的時(shí)間:
- // 立即執(zhí)行Runnable對(duì)象
- public final boolean post(Runnable r);
- // 在指定的時(shí)間(uptimeMillis)執(zhí)行Runnable對(duì)象
- public final boolean postAtTime(Runnable r, long uptimeMillis);
- // 在指定的時(shí)間間隔(delayMillis)執(zhí)行Runnable對(duì)象
- public final boolean postDelayed(Runnable r, long delayMillis);
從上面3個(gè)方法可以看出,第1個(gè)參數(shù)的類型都是Runnable,因此,在調(diào)用這3個(gè)方法之前,需要有一個(gè)實(shí)現(xiàn)Runnable接口的類,Runnable接口的代碼如下:
- public interface Runnable
- {
- public void run(); // 線程要執(zhí)行的方法
- }
在Runnable接口中只有一個(gè)run方法,該方法為線程執(zhí)行方法。在本例中Main類實(shí)現(xiàn)了Runnable接口??梢允褂萌缦麓a指定在5秒后調(diào)用run方法:
- Handler handler = new Handler();
- handler.postDelayed(this, 5000);
如果想在5秒內(nèi)停止計(jì)時(shí),可以使用如下代碼:
- handler.removeCallbacks(this);
除此之外,還可以使用postAtTime方法指定未來(lái)的某一個(gè)精確時(shí)間來(lái)執(zhí)行Runnable對(duì)象,代碼如下:
- Handler handler = new Handler();
- handler.postAtTime(new RunToast(this)
- {
- }, android.os.SystemClock.uptimeMillis() + 15 *
1000); // 在15秒后執(zhí)行Runnable對(duì)象
其中RunToast是一個(gè)實(shí)現(xiàn)Runnable接口的類,代碼如下:
- class RunToast implements Runnable
- {
- private Context context;
- public RunToast(Context context)
- {
- this.context = context;
- }
- @Override
- public void run()
- {
- Toast.makeText(context, "15秒后顯
示Toast提示信息", Toast.LENGTH_LONG).show();- }
- }
postAtTime的第2個(gè)參數(shù)表示一個(gè)精確時(shí)間的毫秒數(shù),如果從當(dāng)前時(shí)間算起,需要使用android.os.SystemClock.uptimeMillis()獲得基準(zhǔn)時(shí)間。
要注意的是,不管使用哪個(gè)方法來(lái)執(zhí)行Runnable對(duì)象,都只能運(yùn)行一次。如果想循環(huán)執(zhí)行,必須在執(zhí)行完后再次調(diào)用post、postAtTime或postDelayed方法。例如,在Main類的run方法中再次調(diào)用了postDelayed方法,代碼如下:
- public void run()
- {
- tvCount.setText("Count:" + String.valueOf(++count));
- // 再次調(diào)用postDelayed方法,5秒后run方法仍被
調(diào)用,然后再一次調(diào)用postDelayed方法,這樣就形成了- // 循環(huán)調(diào)用
- handler.postDelayed(this, 5000);
- }
運(yùn)行本例后,單擊【開始計(jì)數(shù)】按鈕,5秒后,會(huì)在按鈕上方顯示計(jì)數(shù)信息。然后單擊【15秒后顯示Toast信息框】按鈕,過15秒后,會(huì)顯示一個(gè)Toast信息框,如圖8.17所
聯(lián)系客服