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这边一删,别人软件就崩了。

搬瓦工最新套餐KVM,CN2线路

搬瓦工在国内非常流行的主机商,以提供低价的vps著称.不过近几年价格逐渐攀升.不过稳定性和速度一向不错.依然深受国内vps爱好者喜爱.新上线的套餐经常卖到断货.支持支付宝,paypal很方便购买和使用.官网网站:https://www.bandwagonhost.com[不能直接访问,已墙]https://www.bwh88.net[有些地区不能直接访问]https://www.bwh81.net...

香港ceranetworks(69元/月) 2核2G 50G硬盘 20M 50M 100M 不限流量

香港ceranetworks提速啦是成立于2012年的十分老牌的一个商家这次给大家评测的是 香港ceranetworks 8核16G 100M 这款产品 提速啦老板真的是豪气每次都给高配我测试 不像别的商家每次就给1核1G,废话不多说开始跑脚本。香港ceranetworks 2核2G 50G硬盘20M 69元/月30M 99元/月50M 219元/月100M 519元/月香港ceranetwork...

弘速云(28元/月)香港葵湾2核2G10M云服务器

弘速云怎么样?弘速云是创建于2021年的品牌,运营该品牌的公司HOSU LIMITED(中文名称弘速科技有限公司)公司成立于2021年国内公司注册于2019年。HOSU LIMITED主要从事出售香港vps、美国VPS、香港独立服务器、香港站群服务器等,目前在售VPS线路有CN2+BGP、CN2 GIA,该公司旗下产品均采用KVM虚拟化架构。可联系商家代安装iso系统,目前推出全场vps新开7折,...

handlerthread为你推荐
中国万维网中国互联网的历史是怎样的呢?什么时候开始的呢?互联网舆情监控系统最好的舆情监控软件scriptmanagerScriptManager是什么怎么用电脑发短信怎么样用电脑给手机发短信?公众号付费阅读如何申请微信付费阅读功能上行宽带上行宽带是什么?java程序员招聘java程序员学出来工作好不好找,工资咋样?网络安全密钥网络安全密钥一般是什么网站客服代码怎么在网页用HTML代码设置QQ客服动画分镜头脚本经典动画片分镜头脚本
宿迁服务器租用 香港vps asp.net主机 payoneer 主机屋免费空间 中国特价网 193邮箱 网站cdn加速 169邮箱 泉州电信 域名接入 中国网通测速 空间购买 上海电信测速网站 外贸空间 丽萨 新加坡空间 杭州电信宽带优惠 免费个人网页 数据湾 更多