万书网 > 文学作品 > Android从入门到精通 > 第133页

第133页



public  class  ClassName  extends  Object  implements  Runnable

当一个类实现Runnable接口后,还需要实现其run()方法,在run()方法中,可以编写要执行的操作的代码。

例如,要创建一个实现了Runnable接口的Activity,可以使用下面的代码:

public  class  MainActivity  extends  Activity  implements  Runnable  {



@Override



public  void  onCreate(Bundle  savedInstanceState)  {



super.onCreate(savedInstanceState);



setContentView(R.layout.main);



}



@Override



public  void  run()  {



//要执行的操作



}



}

12.1.2 开启线程

创建线程对象后,还需要开启线程,线程才能执行。Thread类提供了start()方法用于开启线程,其语法格式如下:

start()

例如,存在一个名称为thread的线程,如果想开启该线程,可以使用下面的代码:

thread.start();  //开启线程

12.1.3 线程的休眠

线程的休眠就是让线程暂停一段时间后再次执行。同Java一样,在Android中,也可以使用Thread类的sleep()方法让线程休眠指定的时间。sleep()方法的语法格式如下:

sleep(long  time)

其中参数time用于指定休眠的时间,单位为毫秒。

例如,想要线程休眠1秒钟,可以使用下面的代码:

Thread.sleep(1000);

12.1.4 中断线程

当需要中断指定的线程时,可以使用Thread类提供的interrupt()方法来实现。使用interrupt()方法可以向指定的线程发送一个中断请求,并将该线程标记为中断状态。interrupt()方法的语法格式如下:

interrupt()

例如,存在一个名称为thread的线程,如果想中断该线程,可以使用下面的代码:

…  //省略部分代码



thread.interrupt();



…  //省略部分代码



public  void  run()  {



while(  !Thread.currentThread().isInterrupted()  ){



…  //省略部分代码



}



}

另外,由于当线程执行wait()、join()或sleep()方法时,线程的中断状态将被清除并抛出InterruptedException,所以,如果想在线程中执行了wait()、join()或sleep()方法时中断线程,就需要使用一个boolean型的标记变量来记录线程的中断状态,并通过该标记变量来控制循环的执行与停止。例如,通过名称为isInterrupt的boolean型变量来标记线程的中断,关键代码如下:

private  boolean  isInterrupt=false;  //定义标记变量



…  //省略部分代码



…  //在需要中断线程时,将isInterrupt的值设置为true



public  void  run()  {





while(!isInterrupt){



…  //省略部分代码



}



}

12.1.5 范例1:通过实现Runnable接口来创建线程

例12.1   在Eclipse中创建Android项目,名称为12.1,通过实现Runnable接口来创建线程、开启线程和中断线程。(实例位置:光盘\TM\sl\12\12.1)

(1)修改新建项目的res\layout目录下的布局文件main.xml,将默认添加的TextView组件删除,然后在默认添加的线性布局管理器中添加两个按钮,一个用于开启线程,另一个用于中断线程,具体代码请参见光盘。

(2)打开默认添加的MainActivity,让该类实现Runnable接口,修改后的创建类的代码如下:

public  class  MainActivity  extends  Activity  implements  Runnable  {}

(3)实现Runnable接口中的run()方法,在该方法中,判断当前线程是否被中断,如果没有被中断,则将循环变量值加1,并在日志中输出循环变量的值,具体代码如下:

@Override



public  void  run()  {



while  (!Thread.currentThread().isInterrupted())  {



i++;



Log.i("循环变量:",  String.valueOf(i));



}



}

(4)在该MainActivity中,创建两个成员变量,具体代码如下:

private  Thread  thread;  //声明线程对象



int  i;  //循环变量

(5)在onCreate()方法中,首先获取布局管理器中添加的“开始”按钮,然后为该按钮添加单击事件监听器,在重写的onCreate()方法中,根据当前Activity创建一个线程,并开启该线程,具体代码如下:

Button  startButton  =  (Button)  findViewById(R.id.button1);  //获取“开始”按钮



startButton.setOnClickListener(new  OnClickListener()  {



@Override



public  void  onClick(View  v)  {



i  =  0;



thread  =  new  Thread(MainActivity.this);  //创建一个线程



thread.start();  //开启线程



}



});

(6)获取布局管理器中添加的“停止”按钮,并为其添加单击事件监听器,在重写的onCreate()方法中,如果thread对象不为空,则中断线程,并向日志中输出提示信息,具体代码如下:

Button  stopButton  =  (Button)  findViewById(R.id.button2);  //获取“停止”按钮



stopButton.setOnClickListener(new  OnClickListener()  {



@Override



public  void  onClick(View  v)  {



if  (thread  !=  null)  {



thread.interrupt();  //中断线程



thread  =  null;



}



Log.i("提示:",  "中断线程");



}



});

(7)重写MainActivity的onDestroy()方法,在该方法中中断线程,具体代码如下:

@Override



protected  void  onDestroy()  {