纸上得来终觉浅,绝知此事要躬行 --陆游
问渠那得清如许,为有源头活水来 --朱熹
首先,Android的UI操作不是线程安全的,这就是说多线程并发操作UI组件时可能会出现线程安全问题。
Handler类主要有两个作用:
(1)在新启动的线程中发送消息。
(2)在主线程中获取消息,处理消息。
Handler 包含如下方法用于发送、处理消息:
void handleMessage(Message msg):处理消息的方法,该方法通常会被重写
final boolean hasMessage(int what):检查消息队列中是否包含what属性为指定值的消息
final boolean hasMessage(int what , Object object ):检查消息队列中是否包含what属性为指定值且object属性为指定对象的消息
多个重载的Message obtainMessage():获取消息
sendEmptyMessage(int what ):发送空消息
final boolean sendEmptyMessageDelayed(int what , long delayMillis ):指定多少毫秒之后发送消息
final boolean sendMessage( Message message) : 立即发送消息
final boolean sendMessageDelayed(Message msg , long delayMillis):指定多少毫秒之后发送消息
final boolean post( Runnable runnable):将线程加入消息队列
final boolean postAtTime(Runnable r , long uptimeMillis): 将线程在指定时间之后加入消息队列
final boolean postDelayed(Runnable r, long delayMillis): 将线程在指定的延迟时间后加入消息队列
final void removeCallbacks(Runnable r) :将线程从消息队列中 去掉
final void removeCallbacks(Runnable r, Object token):将线程和对象从消息队列中去掉(这边有多个重载的removeCallbacks)
final Looper getLooper() :获得Looper对象,之后介绍
简单的实例:
public class MainActivity extends Activity {
Button mybutton;
ProgressBar myprogressbar;
int i=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mybutton=(Button)findViewById(R.id.mybutton);
myprogressbar=(ProgressBar)findViewById(R.id.myprogressbar);
mybutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myprogressbar.setVisibility(View.VISIBLE);
handler.post(myrunnable);
}
});
}
Handler handler=new Handler()
{
@Override
public void handleMessage(Message message)
{
if(message.arg1>0)
{
Log.v("re",message.arg1+"sd");
myprogressbar.setProgress(message.arg1);
handler.post(myrunnable);
}
}
};
Runnable myrunnable=new Runnable() {
@Override
public void run()
{
i = i + 10;
if (i <= 100)
{
Message message = handler.obtainMessage();
message.arg1 = i;
Log.v("info",i+"ok");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
handler.sendMessage(message);
if(i>100)
{
handler.removeCallbacks(myrunnable);
i=0;
}
}
}
};
}
结果: