Android基础学习之异步任务使用Handler
来源:互联网 发布:缠论均线指标公式源码 编辑:程序博客网 时间:2024/05/18 01:11
通常,一个程序中会有好几个线程或任务同时进行,有的快有的慢。UI线程(也称main线程)是不允许阻塞的主线程,有时需要做一个耗时的任务时,为了不阻塞主线程,就会用到异步任务。
下面是使用Handler方法去怎么做到异步任务。
Handler的定义:主要接受子线程发送的数据, 并用此数据配合主线程更新UI。
作用:可定时或延时发消息。
//发消息对象
sendEmptyMessage(int) 发空消息
sendMessage(Message)
sendMessageAtTime(Message, long) //在哪个时刻发
sendMessageDelayed(Message, long) //延迟多久发
//发Runnable对象
post(Runnable)
postAtTime(Runnable, long)
postDelayed(Runnable, long)
用法:
class XXXActivity{ Handler handler=new Handler(){ handleMessage(msg){ //更新UI } }; onClick(){ download(...); } download(){ new Thread(){ //耗时任务 handler.sendXXXMessage(msg) }.start(); }}
示例:
1.定义一个测试xml布局
2.java代码
下面测试了两个异步任务,一个是模拟下载任务,一个是时钟任务
public class MainActivity extends Activity implements OnClickListener { private TextView textView1; private TextView textView; private Button button; private ProgressDialog pd; private int value; //利用Handler接收消息 Handler handler = new Handler() { @Override public void handleMessage(Message msg) { if (msg.what == 123) { if (msg.arg1 <= 100) { pd.setProgress(value); textView1.setText(value + "%"); } } if(msg.what == 456){ textView.setText(getDate()); handler.sendEmptyMessageDelayed(456, 1000);//每隔一秒钟发送一次消息 } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); textView1 = (TextView) findViewById(R.id.textView1); textView = (TextView) findViewById(R.id.textView); button = (Button) findViewById(R.id.button1); button.setOnClickListener(this); } @Override public void onClick(View v) { showProgeress(); } //弹出进度条对话框 private void showProgeress() { pd = new ProgressDialog(this); pd.setTitle("后台任务"); pd.setMessage("正在下载,请稍后..."); pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); pd.show(); //将更新进度放在子线程中 new Thread() { @Override public void run() { while (true) {//利用死循环不断发布进度 try { Thread.sleep(500);//模拟下载进度时间 } catch (InterruptedException e) { e.printStackTrace(); } value += 1; //隔一定时间发送一次消息和值 Message msg = Message.obtain();//从消息池中获取消息对象,避免重复创建 msg.what = 123;//消息ID msg.arg1 = value;//消息的第一个值(消息可以附带两个值:arg1和arg2) handler.sendMessage(msg);//发送消息 if (value == 100) {//当进度满跳出死循环 break; } } pd.dismiss();//关闭对话框 } }.start(); } public String getDate() { Calendar c = Calendar.getInstance();//Calendar对象可获取系统对象 String year = String.valueOf(c.get(Calendar.YEAR)); String month = String.valueOf(c.get(Calendar.MONDAY)); String day = String.valueOf(c.get(Calendar.DAY_OF_MONTH) + 1); String hour = String.valueOf(c.get(Calendar.HOUR_OF_DAY)); String mins = String.valueOf(c.get(Calendar.MINUTE)); String seconds = String.valueOf(c.get(Calendar.SECOND)); return year + "-" + month + "-" + day + " " + hour + ":" + mins + ":" + seconds; } @Override protected void onStart() { if(handler!=null){ handler.sendEmptyMessage(456);//发送消息,参数:消息ID } super.onStart(); } @Override protected void onStop() { if(handler!=null){ handler.removeMessages(456);//移除消息,但不调用消息处理方法 } super.onStop(); }}
效果:
0 0
- Android基础学习之异步任务使用Handler
- Android学习之异步任务Handler
- Android基础学习之异步任务使用Thread(线程)
- Android异步任务机制之Handler
- Android学习笔记:Android异步任务之AsyncTask基础
- Android基础之Handler使用
- android 异步任务 设置 超时,使用handler更新通知
- Android:异步任务基础
- android学习之异步任务AsyncTask
- Android学习之异步任务AsyncTask
- Android异步任务之AsyncTask的使用
- Android异步任务之AsyncTask基本使用
- Android基础学习之AsyncTask(异步任务处理类)一
- Android基础学习之AsyncTask(异步任务处理类)二
- Android异步任务机制—Handler
- Android中的Handler机制、异步任务
- Android基础之Handler机制学习
- android基础之Handler的使用(一)
- <script>标签的for属性和event属性
- ECMAScript对象3:对象类型
- javascript基础5-修改对象
- javascript基础6-对象继承机制实现
- ubuntu 安装svn
- Android基础学习之异步任务使用Handler
- VS2013 常用快捷键
- WEB打印控件Lodop6.0简明教…
- WEB打印控件Lodop6.0简明教…
- 技术支持之----win7自定义打…
- SpringMVC 错误分析:@Autowi…
- Hibernate错误分析:update
- Hibernate的一个注释 @Transient
- Integrate the Shiro&nb…