总得来说
Handler的主要用途有两个:(1)、在将来的某个时刻执行消息或一个runnable;(2)把消息发送到消息队列。
先看效果一:延迟一秒改变文字:点击按钮一秒后改变文字
再看效果二:进度条3秒后消失:点击按钮后出现进度条,3秒后消失。
talk is cheap,show me the code:
package mountain_hua.learn1;
import android.app.ProgressDialog;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private TextView textView;
private int i = 0;
private ProgressDialog dlog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView= (TextView) findViewById(R.id.textview);
Button B1=(Button)findViewById(R.id.button);
Button B2=(Button)findViewById(R.id.button2);
//改变文字按钮
B1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
++i;
//创建新的线程
new Thread(){
@Override
public void run() {
super.run();
doSendMsg();
}
}.start();
}
});
//对话框按钮
B2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dodialog();
}
});
}
/**
* 在子线程中做耗时操作,完成之后,通知Handler更新UI
*/
//发送消息
private void doSendMsg(){
try {
Thread.sleep(1000);//模拟耗时操作1秒
} catch (InterruptedException e) {
e.printStackTrace();
}
Message message = Message.obtain();
message.arg1 = i;
message.what = 1;
myHandler.sendMessage(message);
}
//进度条对话框
private void dodialog(){
dlog=ProgressDialog.show(MainActivity.this,"测试对话框","3秒后关闭。。。");
new Thread(){
@Override
public void run(){
super.run();
try {
Thread.sleep(3000);//模拟耗时操作3秒
} catch (InterruptedException e) {
e.printStackTrace();
}
Message message=Message.obtain();
message.arg1=0;
message.what=2;
myHandler.sendMessage(message);
}
}.start();
/*如果把子线程中这段语句剪切至这里,就变成主线程中的语句了,
myhander会直接接收到消息,进度条对话框直接消失甚至不出现,不会有3秒延迟。
Message message=Message.obtain();
message.arg1=0;
message.what=2;
myHandler.sendMessage(message);
*
* */
}
Handler myHandler = new Handler(){
/**
* handleMessage接收消息后进行相应的处理
*/
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(msg.what==1){
//改变TextView
textView.setText(msg.arg1+"");
}
else if(msg.what==2){
//使对话框消失
Toast.makeText(MainActivity.this,"测试成功",Toast.LENGTH_SHORT).show();
dlog.dismiss();
}
}
};
}