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