android-handler

摘自http://www.cnblogs.com/plokmju/p/android_handler.html

注意:对于UI组件,不能再其他线程内操作它(如调用它的方法)

        比如

        Button bt1=(Button)findViewById(R.id.start);
        
        
        Button bt2=(Button)findViewById(R.id.stop);
        progress=sb.getProgress();
         bt1.setOnClickListener(new View.OnClickListener() {
            
            
            public void onClick(View v) {
                                  new Thread(){

                                                          public void run()
                                                            {
                                                               bt1.setText("dfs");//error!!!!
                                                             }
                                                           }.start();
            }
        });

   所以Handler起到了在Thread和Activity里组件通信的目的
  

Handler

  Handler,它直接继承自Object,一个Handler允许发送和处理Message或者Runnable对象,并且会关联到主线程的MessageQueue中。每个Handler具有一个单独的线程,并且关联到一个消息队列的线程,就是说一个Handler有一个固有的消息队列。当实例化一个Handler的时候,它就承载在一个线程和消息队列的线程,这个Handler可以把Message或Runnable压入到消息队列,并且从消息队列中取出Message或Runnable,进而操作它们。

  Handler主要有两个作用:

  • 在工作线程中发送消息。
  • 在UI线程中获取、处理消息。

  上面介绍到Handler可以把一个Message对象或者Runnable对象压入到消息队列中,进而在UI线程中获取Message或者执行Runnable对象,所以Handler把压入消息队列有两大体系,Post和sendMessage:

  • Post:Post允许把一个Runnable对象入队到消息队列中。它的方法有:post(Runnable)、postAtTime(Runnable,long)、postDelayed(Runnable,long)。
  • sendMessage:sendMessage允许把一个包含消息数据的Message对象压入到消息队列中。它的方法有:sendEmptyMessage(int)、sendMessage(Message)、sendMessageAtTime(Message,long)、sendMessageDelayed(Message,long)。

  从上面的各种方法可以看出,不管是post还是sendMessage都具有多种方法,它们可以设定Runnable对象和Message对象被入队到消息队列中,是立即执行还是延迟执行。

  

Post

  对于Handler的Post方式来说,它会传递一个Runnable对象到消息队列中,在这个Runnable对象中,重写run()方法。一般在这个run()方法中写入需要在UI线程上的操作。

  在Handler中,关于Post方式的方法有:

  • boolean post(Runnable r):把一个Runnable入队到消息队列中,UI线程从消息队列中取出这个对象后,立即执行。
  • boolean postAtTime(Runnable r,long uptimeMillis):把一个Runnable入队到消息队列中,UI线程从消息队列中取出这个对象后,在特定的时间执行。
  • boolean postDelayed(Runnable r,long delayMillis):把一个Runnable入队到消息队列中,UI线程从消息队列中取出这个对象后,延迟delayMills秒执行
  • void removeCallbacks(Runnable r):从消息队列中移除一个Runnable对象。

    实现seekar的进度条启动过程

public class SeekBarActivity extends Activity{
    private SeekBar sb=null;
    private Handler handler=new Handler() ;
    private int progress=0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.seekbar);
        sb=(SeekBar)findViewById(R.id.sb);
        Button bt1=(Button)findViewById(R.id.start);
        Button bt2=(Button)findViewById(R.id.stop);
        progress=sb.getProgress();
         bt1.setOnClickListener(new View.OnClickListener() {
            
            
            public void onClick(View v) {
                // 将runnable放入(post)消息队列
                // runnable里run方法继续调用post将自己再放入
                handler.post(rb);
            }
        });
         bt2.setOnClickListener(new View.OnClickListener() {
             
             public void onClick(View v) {
                 // TODO Auto-generated method stub
                 handler.removeCallbacks(rb);
             }
         });
        
    }
      Runnable rb=new Runnable() {
            
            public void run() {
                // 
                 progress++;
                 sb.setProgress(progress);
                 if(progress<100)
                 {
                     handler.post(rb);
                     try {
                            Thread.sleep(500);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                 }
                 else
                     handler.removeCallbacks(rb);
            }
        };
}

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。