UUTON

悠悠途恩

Android Handler Runnable

通过Handler类,可以提交和处理Message对象和Runnable对象,这里介绍Runnable对象。

Ruannable对象的run方法可以立刻执行某个操作,也可以在指定时间后执行(也可称为预约执行)。

Handler类主要可以使用如下3个方法来设置执行Runnable对象的时间(时间单位是毫秒):

public final boolean post(Runnable r);                        //  立即执行Runnable对象  

public final boolean postAtTime(Runnable r, long uptimeMillis);  //  在指定的时间(uptimeMillis)执行Runnable对象 

public final boolean postDelayed(Runnable r, long delayMillis);  //  在指定的时间间隔(delayMillis)执行Runnable对象  

从上面3个方法可以看出,第1个参数的类型都是Runnable,因此,在调用这3个方法之前,需要有一个实现Runnable接口的类,

先看一下,Runnable接口的代码:

    public interface Runnable {  

        public void run();          //  线程要执行的方法  

    } 

可见,在Runnable接口中只有一个run方法,该方法为线程执行方法。如果某个类实现了Runnable接口。可以使用如下代码指定在5秒后调用run方法:

    Handler handler = new Handler();  

    handler.postDelayed(this, 5000); 

如果想在5秒内停止计时,可以使用如下代码:

    handler.removeCallbacks(this); 

除此之外,还可以使用postAtTime方法指定未来的某一个精确时间来执行Runnable对象,代码如下:

    Handler handler = new Handler();  

    handler.postAtTime(new RunToast(this){}, android.os.SystemClock.uptimeMillis() + 15 * 1000);  // 15秒后执行Runnable对象 

其中RunToast是一个实现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个参数表示一个精确时间的毫秒数,如果从当前时间算起,需要使用android.os.SystemClock.uptimeMillis()获得基准时间。

要注意的是,不管使用哪个方法来执行Runnable对象,都只能运行一次。

如果想循环执行,必须在执行完后再次调用post、postAtTime或postDelayed方法。例如,在Main类的run方法中再次调用了postDelayed方法:

    public void run(){  

        tvCount.setText("Count:" + String.valueOf(++count));  

        //  再次调用postDelayed方法,5秒后run方法仍被调用,然后再一次调用postDelayed方法,这样就形成了  

        //  循环调用  

        handler.postDelayed(this, 5000);  

    } 


运行本例后,单击【开始计数】按钮,5秒后,会在按钮上方显示计数信息。

然后单击【15秒后显示Toast信息框】按钮,过15秒后,会显示一个Toast信息框。


评论

© UUTON | Powered by LOFTER