Android handlerthread使用 thread 详细怎么使用

& 详解Android Handler的使用
详解Android Handler的使用
&&&&&& 我们进行Android开发时,可以说是使用非常频繁的一个概念,它的用处不言而喻。本文就详细介绍Handler的基本概念和用法。&&&&&&&Handler的基本概念&&&&&&&& Handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一个部分逐个的在消息队列中将消息取出,然后对消息进行出来,就是发送消息和接收消息不是同步的处理。 这种机制通常用来处理相对耗时比较长的操作。&&&&&& Handler工具类在多线程中有两方面的应用:  1、发送消息,在不同的线程间发送消息,使用的方法为sendXXX();。  android.os.Handler对象通过下面的方法发送消息的:  sendEmptyMessage(int),发送一个空的消息;  sendMessage(Message),发送消息,消息中可以携带参数;  sendMessageAtTime(Message, long),未来某一时间点发送消息;  sendMessageDelayed(Message, long),延时Nms发送消息。&&&&&& 2、计划任务,在未来执行某任务,使用的方法为postXXX();。  android.os.Handler对象通过下面的方法执行计划任务:  post(Runnable),提交计划任务马上执行;  postAtTime(Runnable, long),提交计划任务在未来的时间点执行;  postDelayed(Runnable, long),提交计划任务延时Nms执行。&&&&&& 使用一个例子简单的来介绍一下Handler。&&&&&&&示例1:一个应用程序中有2个按钮(start、end),当点击start按钮时,执行一个线程,这个线程在控制台输出一串字符串,并且每隔3秒再执行一次线程,直到点击end按钮为止,线程停止。&&&&&& 下图为这个应用程序的界面:&&&&&& 下图为执行程序时控制台的输出:&&&&& 开发步骤:&&&&&& 1、新建一个Android应用程序&&&&&& 2、在布局文件中添加2个控件标签,并为其设置属性和值&&&&&& 3、在中,声明控件变量并根据id获得控件对象&&&&&& 4、在Activity中,创建一个Handler对象&&&&&& 5、在Activity中,创建一个Runnable对象&&&&&& a) 以匿名内部类的方式&&&&&&&b) 将要执行的操作写在Runnable对象中的run()方法中&&&&&& i. 打印出一句话&&&&&& ii. 调用Runnable对象的postDelayed()方法&&&&&& 6、在Activity中,编写start按钮需要的***器,并绑定。&&&&& 在这个***器的Onclick()方法中,调用Handler的post()方法,将要执行的对象放到队列当中。&&&&&& 7、在Activity中,编写end按钮需要的***器,并帮定。&&&&& 在这个***器的Onclick()方法中,调用Handler的removeCallbacks ()方法,删除队列当中未执行的线程对象。&&&&&& 下面是Activity的代码:
package&android.&&& &&
import&android.app.A&&& &&
import&android.os.B&&& &&
import&android.os.H&&& &&
import&android.view.V&&& &&
import&android.view.View.OnClickL&&& &&
import&android.widget.B&&& &&
public&class&HandlerTest&extends&Activity&{&&& &&
&&&&private&Button&startB&&& &&
&&&&private&Button&endB&&& &&
&&&&&&& &&
&&&&@Override&& &&
&&&&public&void&onCreate(Bundle&savedInstanceState)&{&&& &&
&&&&&&&&super.onCreate(savedInstanceState);&&& &&
&&&&&&&&setContentView(R.layout.main);&&& &&
&&&&&&&&&&
&&&&&&&&startButton&=&(Button)findViewById(R.id.startButton);&&& &&
&&&&&&&&endButton&=&(Button)findViewById(R.id.endButton);&&& &&
&&&&&&&&&&
&&&&&&&&startButton.setOnClickListener(new&StartButtonListener());&&& &&
&&&&&&&&endButton.setOnClickListener(new&EndButtonListener());&&& &&
&&&&}&&& &&
&&&&&&& &&
&&&&class&StartButtonListener&implements&OnClickListener{&&& &&
&&&&&&&&public&void&onClick(View&v)&{&&& &&
&&&&&&&&&&&&&&
&&&&&&&&&&&&handler.post(updateThread);&&& &&
&&&&&&&&}&&& &&
&&&&}&&& &&
&&&&&&& &&
&&&&class&EndButtonListener&implements&OnClickListener{&&& &&
&&&&&&&&public&void&onClick(View&v)&{&&& &&
&&&&&&&&&&&&&&
&&&&&&&&&&&&handler.removeCallbacks(updateThread);&&& &&
&&&&&&&&}&&& &&
&&&&&&&&&&& &&
&&&&}&&& &&
&&&&&&& &&
&&&&Handler&handler&=&new&Handler();&&& &&
&&&&Runnable&updateThread&=&new&Runnable(){&&& &&
&&&&&&&&&&
&&&&&&&&public&void&run(){&&& &&
&&&&&&&&&&&&System.out.println(&updateThread&);&&& &&
&&&&&&&&&&&&&&
&&&&&&&&&&&&&&
&&&&&&&&&&&&&&
&&&&&&&&&&&&&&
&&&&&&&&&&&&handler.postDelayed(updateThread,&3000);&&& &&
&&&&&&&&}&&& &&
&&&&};&&& &&
}&&&&&&&&&& 示例2:一个应用程序中有一个进度条和一个按钮,当点击按钮后,每隔一秒钟进度条前进一部分。&&&&&& 开发步骤: &&&&&& 1、新建一个Android应用程序&&&&&& 2、在布局文件中添加一个和一个Button,并为其设置属性和值&&&&&& 3、在Activity中,声明控件变量并根据id获得控件对象&&&&&& 4、创建线程对象&&&&&&&a)通过匿名内部类的方式&&&&&& b)在编写完了5、6步之后再来继续编写这个线程对象里的操作&&&&&& i. 声明一个变量用来设置进度条的进度&&&&&& ii. 重写线程类的run方法(),里面编写要执行的操作&&&&&& 1)打印一个字符串&&&&&& 2)进度条的值增加&&&&&& 3)得到一个消息对象&&&&&& 4)设置消息对象arg1的值&&&&&& 5)让线程休眠一秒钟&&&&&& 6)将消息对象放入到消息队列中&&&&&& 7)判断,如果进度条的值等于100,则将线程对象从队列中移除。&&&&&& 5、 创建Handler对象&&&&&& a) 与示例1不同的地方是,这里是通过匿名内部类的方式来声明的,而示例1是直接new出来的对象。&&&&&& b) 重写Handler对象的handlerMessage(Message msg)方法。&&&&&& i. 这个方法传入了一个Message对象,即消息对象,首先设置进度条的进度(这个值是Messag对象里面的一个成员变量arg1)。&&&&&&&ii. 将要执行的线程对象放入到队列当中。&&&&&& 6、 编写Button需要的***器,并绑定&&&&&& a) 设置进度条为显示状态。&&&&&& b) 将要执行的线程对象放入到队列当中。&&&&&& 下面是Activity的代码:
package&android.&&& &&
import&android.app.A&&& &&
import&android.os.B&&& &&
import&android.os.H&&& &&
import&android.os.M&&& &&
import&android.view.V&&& &&
import&android.view.View.OnClickL&&& &&
import&android.widget.B&&& &&
import&android.widget.ProgressB&&& &&
public&class&ProgressBarHandlerTest&extends&Activity&{&&& &&
&&&&&&& &&
&&&&private&ProgressBar&progressB&&& &&
&&&&private&Button&startB&&& &&
&&&&&&& &&
&&&&@Override&& &&
&&&&public&void&onCreate(Bundle&savedInstanceState)&{&&& &&
&&&&&&&&super.onCreate(savedInstanceState);&&& &&
&&&&&&&&setContentView(R.layout.main);&&& &&
&&&&&&&&&&& &&
&&&&&&&&progressBar&=&(ProgressBar)findViewById(R.id.progressbar);&&& &&
&&&&&&&&startButton&=&(Button)findViewById(R.id.startButton);&&& &&
&&&&&&&&&&& &&
&&&&&&&&startButton.setOnClickListener(new&ProgressBarOnClickListener());&&& &&
&&&&}&&& &&
&&&&&&& &&
&&&&class&ProgressBarOnClickListener&implements&OnClickListener{&&& &&
&&&&&&&&public&void&onClick(View&v)&{&&& &&
&&&&&&&&&&&&&&
&&&&&&&&&&&&progressBar.setVisibility(View.VISIBLE);&&& &&
&&&&&&&&&&&&updateBarHandler.post(updateThread);&&& &&
&&&&&&&&}&&& &&
&&&&}&&& &&
&&&&&&& &&
&&&&Handler&updateBarHandler&=&new&Handler(){&&& &&
&&&&&&&&@Override&& &&
&&&&&&&&public&void&handleMessage(Message&msg)&{&&& &&
&&&&&&&&&&&&progressBar.setProgress(msg.arg1);&&& &&
&&&&&&&&&&&&updateBarHandler.post(updateThread);&&&&&&
&&&&&&&&}&&& &&
&&&&};&&& &&
&&&&&&& &&
&&&&Runnable&updateThread&=&new&Runnable(){&&& &&
&&&&&&&&int&i&=&0;&&& &&
&&&&&&&&public&void&run()&{&&& &&
&&&&&&&&&&&&&&
&&&&&&&&&&&&System.out.println(&Begin&Thread&);&&& &&
&&&&&&&&&&&&i+=10;&&& &&
&&&&&&&&&&&&&&
&&&&&&&&&&&&Message&msg&=&updateBarHandler.obtainMessage();&&& &&
&&&&&&&&&&&&&&
&&&&&&&&&&&&msg.arg1&=&i;&&&&&
&&&&&&&&&&&&try{&&& &&
&&&&&&&&&&&&&&&&Thread.sleep(1000);&&&
&&&&&&&&&&&&}catch(InterruptedException&ex){&&& &&
&&&&&&&&&&&&&&&&ex.printStackTrace();&&& &&
&&&&&&&&&&&&}&&& &&
&&&&&&&&&&&&&&
&&&&&&&&&&&&updateBarHandler.sendMessage(msg);&&& &&
&&&&&&&&&&&&&&
&&&&&&&&&&&&if&(i&==&100){&&& &&
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&updateBarHandler.removeCallbacks(updateThread);&&&& &&
&&&&&&&&&&&&}&&& &&
&&&&&&&&}&&& &&
&&&&};&&& &&
本文发布:
本文地址:
发布:鸡啄米
&&( 21:32:11)&&( 21:31:38)&&( 0:27:34)&&( 20:34:19)&&( 23:21:21)&&( 23:52:19)&&( 21:58:33)&&( 21:46:3)&&( 21:3:36)&&( 23:44:40)
不错,还真是比较详细
感觉是错的。
完全随机文章403 Forbidden
403 ForbiddenAndroid中的Handler详解以及和Thread的区别
往事随风0200
不知道这么高深的问题呀 怎么办好 怎么办好啊
为您推荐:
其他类似问题
Thread是线程
至于Handler主要接受子线程发送的数据, 并用此数据配合主线程更新UI.
扫描下载二维码Android HandlerThread使用小例_Linux编程_Linux公社-Linux系统门户网站
你好,游客
Android HandlerThread使用小例
来源:Linux社区&
作者:huanggenda
之前研究过handler 和 looper 消息队列,不过里的handler不是另外开启线程来执行的,还是在主UI线程中,如果想另启线程的话需要用到HandlerThread来实现。在使用HandlerThread的时候需要实现CallBack接口以重写handlerMessage方法,在handlerMessage方法中来处理自己的逻辑。下来给出一个小例子程序。
layout文件很简单,就一个按钮来启动HanlderTread线程
&version="1.0"&encoding="utf-8"&&
&xmlns:android="/apk/res/android"&&
&&&&android:layout_width="fill_parent"&&
&&&&android:layout_height="fill_parent"&&
&&&&android:orientation="vertical"&&&
&&&&&&&&android:layout_width="fill_parent"&&
&&&&&&&&android:layout_height="wrap_content"&&
&&&&&&&&android:text="@string/hello"&&&
&&&&&&&&android:id="@+id/handlerThreadBtn"&&
&&&&&&&&android:layout_width="wrap_content"&&
&&&&&&&&android:layout_height="wrap_content"&&
&&&&&&&&android:text="startHandlerThread"&&&
Activity代码如下:
package&com.&&
import&android.app.A&&
import&android.os.B&&
import&android.os.H&&
import&android.os.Handler.C&&
import&android.os.HandlerT&&
import&android.os.M&&
import&android.view.V&&
import&android.view.View.OnClickL&&
import&android.widget.B&&
public&class&TestHandlerActivity&extends&Activity&implements&OnClickListener{&&
&&&&public&Button&handlerThreadBTN;&&&
&&&&MyHandlerThread&handlerT&&
&&&&Handler&&&
&&&&@Override&&
&&&&public&void&onCreate(Bundle&savedInstanceState)&{&&
&&&&&&&&super.onCreate(savedInstanceState);&&
&&&&&&&&&&
&&&&&&&&System.out.println("onCreate&&CurrentThread&=&"&+&Thread.currentThread().getName());&&
&&&&&&&&&&
&&&&&&&&setContentView(R.layout.main);&&
&&&&&&&&&&
&&&&&&&&handlerThreadBTN&=&(Button)&findViewById(R.id.handlerThreadBtn);&&
&&&&&&&&handlerThreadBTN.setOnClickListener(this);&&
&&&&&&&&&&
&&&&&&&&handlerThread&=&new&MyHandlerThread("myHanler");&&
&&&&&&&&handlerThread.start();&&
&&&&&&&&&&
&&&&&&&&handler&=&new&Handler(handlerThread.getLooper(),&handlerThread);&&
&&&&&&&&&&
&&&&&&&&&&
&&&&@Override&&
&&&&public&void&onClick(View&v)&{&&
&&&&&&&&&&
&&&&&&&&handler.sendEmptyMessage(1);&&
&&&&private&class&MyHandlerThread&extends&HandlerThread&implements&Callback&{&&
&&&&&&&&public&MyHandlerThread(String&name)&{&&
&&&&&&&&&&&&super(name);&&
&&&&&&&&}&&
&&&&&&&&@Override&&
&&&&&&&&public&boolean&handleMessage(Message&msg)&{&&
&&&&&&&&&&&&&&
&&&&&&&&&&&&System.out.println("&handleMessage&CurrentThread&=&"&+&Thread.currentThread().getName());&&
&&&&&&&&&&&&return&true;&&
&&&&&&&&}&&
&&&&&&&&&&
&&&&&&&&&&
点击按钮,打印的日志如下(这里点击了3次)07-06 09:32:48.776: I/System.out(780): onCreate& CurrentThread = main07-06 09:32:55.076: I/System.out(780):& handleMessage CurrentThread = myHanler07-06 09:32:58.669: I/System.out(780):& handleMessage CurrentThread = myHanler07-06 09:33:03.476: I/System.out(780):& handleMessage CurrentThread = myHanler
&HandlerThread就这么简单。
&当然 android自己也有异步线程的handler,就是AsyncTask,这个类就是封装了HandlerThread 和handler来实现异步多线程的操作的。
相关资讯 & & &
& (11/13/:33)
& (09/13/:16)
& (09/13/:32)
& (11/13/:11)
& (09/13/:53)
& (09/13/:15)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款
v 发表于 v 您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&

参考资料

 

随机推荐