handlerthreadAndroid 对线程封装了:AsyncTask, HandlerThread和线程池。 有知道这三个如何选择吗?

handlerthread  时间:2021-06-19  阅读:()

简述android studio中handler通信

在Android中,对于UI的操作通常需要放在主线程中进行操作。

如果在子线程中有关于UI的操作,那么就需要把数据消息作为一个Message对象发送到消息队列中,然后,用Handler中的handlerMessge方法处理传过来的数据信息,并操作UI。

类sendMessage(Message msg)方法实现发送消息的操作。

在初始化Handler对象时重写的handleMessage方法来接收Messgae并进行相关操作。

  传递Runnable对象。

用于通过Handler绑定的消息队列,安排不同操作的执行顺序。

  Handler对象在进行初始化的时候,会默认的自动绑定消息队列。

利用类post方法,可以将Runnable对象发送到消息队列中,按照队列的机制按顺序执行不同的Runnable对象中的run方法。

  另外,Android的CPU分配的最小单元是线程,Handler一般是在某个线程里创建的,因而Handler和Thread就是相互绑定的,一一对应。

而Runnable是一个接口,Thread是Runnable的子类。

所以说,他俩都算一个进程。

android创建子线程

创建后台线程的方法有多种,这里说三种,可以回去试试 1、使用Android系统工具类 AsyncTask(Params,Progress,Result) AsyncTask是一个轻量级线程,三个泛型参数分别是 Params传入参数,int型Progress为进度条进度,Result为返回值 要使用AsyncTask,必须继承之并复写其中的几个重要的函数。

onPreExecute(), 该方法将在执行实际的后台操作前被UI thread调用。

可以在该方法中做一些准备工作,如在界面上显示一个进度条。

doInBackground(Params...), 将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。

这里将主要负责执行那些很耗时的后台计算工作。

可以调用 publishProgress方法来更新实时的任务进度。

该方法是抽象方法,子类必须实现。

onProgressUpdate(Progress...),在publishProgress方法被调用后,UI thread将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。

onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用,后台的计算结果将通过该方法传递到UI thread. 注:Task必须在UI线程中创建,并调用并且只能调用一次execute方法,该方法的参数为传入的泛型Params。

其余函数最好不要手动调用,容易造成线程崩溃。

多次调用Task,容易造成线程池溢出。

2、使用Handler和HandlerThread 误区: Handler handler = new Handler (); handler.post(r); 这种做法看似创建了一个线程,但实际上handler只是直接调用Runnable中的run() 方法,而不执行线程的start()函数,所以这两句代码执行后,程序仍然在UI线程中执行。

所以我们引入HandlerThread,因为HandlerThread中有一个Looper对象,用以循环消息队列。

为了使用Looper,必须子类化Handler,并复写它的构造函数。

class MyHandler extends Handler{ public MyHandler() {} public MyHandler(Looper looper){ super (looper); } public void handleMessage(Message msg){ //....这里运行耗时的过程 } } } handleMessage(Message msg)函数用以接收消息,msg则是从UI线程中发出的消息,可以传递各种对象,根据这些对象和数值进行操作。

有了Handler子类,则可以在UI线程中进行创建和初始化 HandlerThread handlerThread = new HandlerThread( "backgroundThread" ); handlerThread.start(); MyHandler myHandler = new MyHandler(handlerThread.getLooper()); Message msg = myHandler.obtainMessage(); //....此处对msg进行赋值,可以创建一个Bundle进行承载 msg.sendToTarget(); 之后如果需要调用线程,只要对handler传入msg,就可以执行相应的过程了 最后,很重要的一点,HandlerThread 不随Activity的生命周期结束而消亡,所以必须复写Ondestory(),调用HandlerThread () 3、使用线程同步 synchronized、 wait()、 notify() 使用线程同步机制synchronized实现多线程操作,相对来说比较复杂,但也是灵活性最佳、效率最高的一种做法,在产品开发当中也使用得最广。

本人水平相当有限,也只学得一点皮毛。

synchronized相当于一把锁,当线程运行的时候,会同时有几个线程访问一个对象,对其进行操作或者修改。

这可能引起很不良的后果(例如改变判定条件,或者在别的线程还没使用完的时候对象已经被析构等等),所以必须对一些对象进行加锁,保证它在同一时间只允许被一个线程访问。

synchronized使用方法有两种: <1> 同步方法在方法名前加入synchronized关键字,则该方法在同一时间内只允许一个线程访问它,其代码逻辑较为简单,但使用起来不太灵活,并且大大降低效率,耗时太长的同步方法甚至会使得多线程失去原本的意义成为单线程 <2>同步参数 对某一个代码块加锁,并且以synchronized(obj)的方式,表明该代码块内的obj对象是线程同步的。

这个做法使得代码灵活性大大加强,缩小同步代码块的范围,并且可以在不同的函数体和类内进行同步,唯一遗憾的是实现起来比较复杂,容易产生一些问题 而wait()和notify(),必须在synchronized锁的代码块内执行,否则系统将会报错。

有了以上基础,就可以很容易的创建后台线程了 Private Runnable backgroundRunnable = new Runnable () { @Override public void run() { if(isFinish){ //..... break; } for(;;){ synchronized(this){ //....写耗时过程 wait(); } } } } UI线程中,就是一般的创建线程过程了 Thread backgroundThread = new Thread (backgroundRunnable); backgroundThread.start(); 这样,在后台线程中会不断的循环,当执行完一次过程以后就会wait()休眠。

然后在OnTouchListener或者OnClickListener内相应的位置执行 synchronized(backgroundRunnable){ backgroundRunnable.notify(); } 当用户触摸屏幕产生一个event的时候,线程就会被唤醒,执行下一次循环。

最后,还是内存安全问题,必须复写Activity中的OnDestory()方法,将标志量isFinish设为false,并且backgroundThread ()

那个大牛来解释下Service、Handler、Thread之间到底是什么关系?

Service、handler和thread之间没关系。

Service是android的四大组件之一。

其它几个是activity、broadcast和content provider。

handler和thread有一定的关系,但也不是必须的,如果在thread中要更新UI,需要使用handler同步更新。

Handler在多线程中使用Thread.start和Handler.post的区别

于线程的控制,我们将介绍一个 Handler类,使用该类可以对运行在不同线程中的多个任务进行排队,并使用Message和Runnable对象安排这些任务。

在javadoc中, 对Handler是这样解释的:Handler可以发送和处理消息对象或Runnable对象,这些消息对象和Runnable对象与一个线程相关联。

每 个Handler的实例都关联了一个线程和线程的消息队列。

当创建了一个Handler对象时,一个线程或消息队列同时也被创建,该Handler对象将 发送和处理这些消息或Runnable对象。

下面有几种对Handler对象的构造方法需要了解一下: a、如果new一个无参构造函数的Handler对象,那么这个Handler将自动与当前运行线程相关联,也就是说这个Handler将与当前运行的线程使用同一个消息队列,并且可以处理该队列中的消息。

private Handler handler = new Handler(); 我们做这样一个实验,在主用户界面中创建一个带有无参构造函数的Handler对象,该Handler对象向消息队列推送一个Runnable对象, 在Runnable对象的run函数中打印当前线程Id,我们比较主用户界面线程ID和Runnable线程ID是否相同。

具体代码如下: public class HandlerTest01 extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); System.out.println("Activity ---> " + Thread.currentThread().getId()); handler.post(r); } private Handler handler = new Handler(); private Runnable r = new Runnable() { @Override public void run() { try { Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("Runnalbe ---> " + Thread.currentThread().getId()); } }; }

Android 对线程封装了:AsyncTask, HandlerThread和线程池。 有知道这三个如何选择吗?

AsyncTask性能不怎么高,而且还有内存泄漏的隐患。

之所以现在没有删掉这个类库,是因为很多应用都是基于这个库的,Google这边一删,别人软件就崩了。

rfchost:洛杉矶vps/双向CN2 GIA,1核/1G/10G SSD/500G流量/100Mbps/季付$23.9

rfchost怎么样?rfchost是一家开办了近六年的国人主机商,一般能挺过三年的国人商家,还是值得入手的,商家主要销售VPS,机房有美国洛杉矶/堪萨斯、中国香港,三年前本站分享过他家堪萨斯机房的套餐。目前rfchost商家的洛杉矶机房还是非常不错的,采用CN2优化线路,电信双程CN2 GIA,联通去程CN2 GIA,回程AS4837,移动走自己的直连线路,目前季付套餐还是比较划算的,有需要的可...

华纳云CN2高防1810M带宽独享,三网直cn218元/月,2M带宽;独服/高防6折购

华纳云怎么样?华纳云是香港老牌的IDC服务商,成立于2015年,主要提供中国香港/美国节点的服务器及网络安全产品、比如,香港服务器、香港云服务器、香港高防服务器、香港高防IP、美国云服务器、机柜出租以及云虚拟主机等。以极速 BGP 冗余网络、CN2 GIA 回国专线以及多年技能经验,帮助全球数十万家企业实现业务转型攀升。华纳云针对618返场活动,华纳云推出一系列热销产品活动,香港云服务器低至3折,...

欧路云:美国CUVIP线路10G防御,8折优惠,19元/月起

欧路云新上了美国洛杉矶cera机房的云服务器,具备弹性云特征(可自定义需要的资源配置:E5-2660 V3、内存、硬盘、流量、带宽),直连网络(联通CUVIP线路),KVM虚拟,自带一个IP,支持购买多个IP,10G的DDoS防御。付款方式:PayPal、支付宝、微信、数字货币(BTC USDT LTC ETH)测试IP:23.224.49.126云服务器 全场8折 优惠码:zhujiceping...

handlerthread为你推荐
mergefield合并邮件,最后怎么生成呢?youtube创始人李开复的创新工场是做什么的啊???漏洞查询如何查找漏洞 从那做起netbios协议机子上启动了netbios协议,为什么还是运行不了netbios命令netbios协议NETBEUI协议有什么用?java程序员招聘java工程师待遇如何cursorlocation在ENVI中双击遥感图像出来个CURSOR LOCATION/value对话框。下面有个LL : 31?6'21.84"N, 117?9'11.78"E腾讯合作伙伴大会如何成为腾讯渠道合作伙伴?za是哪个国家的ci是在哪个国家产生的?哪个国家开始流行的ocr软件下载哪个图片转文字软件比较好用?
域名邮箱 长沙服务器租用 qq空间域名 互联网域名管理办法 inmotionhosting 北京主机 合肥鹏博士 创梦 免费高速空间 hdd 电信托管 中国电信宽带测速器 德讯 摩尔庄园注册 万网主机 购买空间 碳云 comodo neobux 29美元 更多