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

快云科技:香港沙田CN2云服务器低至29元/月起;美国高防弹性云/洛杉矶CUVIP低至33.6元/月起

快云科技怎么样?快云科技是一家成立于2020年的新起国内主机商,资质齐全 持有IDC ICP ISP等正规商家。云服务器网(yuntue.com)小编之前已经介绍过很多快云科技的香港及美国云服务器了,这次再介绍一下新的优惠方案。目前,香港云沙田CN2云服务器低至29元/月起;美国超防弹性云/洛杉矶CUVIP低至33.6元/月起。快云科技的云主机架构采用KVM虚拟化技术,全盘SSD硬盘,RAID10...

企鹅小屋:垃圾服务商有跑路风险,站长注意转移备份数据!

企鹅小屋:垃圾服务商有跑路风险!企鹅不允许你二次工单的,二次提交工单直接关服务器,再严重就封号,意思是你提交工单要小心,别因为提交工单被干了账号!前段时间,就有站长说企鹅小屋要跑路了,站长不太相信,本站平台已经为企鹅小屋推荐了几千元的业绩,CPS返利达182.67CNY。然后,站长通过企鹅小屋后台申请提现,提现申请至今已经有20几天,企鹅小屋也没有转账。然后,搞笑的一幕出现了:平台账号登录不上提示...

轻云互联,香港云服务器折后22元/月 美国云服务器 1核 512M内存 15M带宽 折后19.36元/月

轻云互联成立于2018年的国人商家,广州轻云互联网络科技有限公司旗下品牌,主要从事VPS、虚拟主机等云计算产品业务,适合建站、新手上车的值得选择,香港三网直连(电信CN2GIA联通移动CN2直连);美国圣何塞(回程三网CN2GIA)线路,所有产品均采用KVM虚拟技术架构,高效售后保障,稳定多年,高性能可用,网络优质,为您的业务保驾护航。官方网站:点击进入广州轻云网络科技有限公司活动规则:1.用户购...

handlerthread为你推荐
照片分享华为手机照片分享功能不显示怎么办中国学生网中国大学生在线邮箱怎么申请?财务系统软件财务管理软件是什么软件youtube创始人鬼步舞创作者是谁avc是什么格式格式工厂转的[AS3 720 AVC]mp4是什么格式avc是什么格式电厂AVC啥意思?webservice框架java Webservice都有哪几种方式啊,哪种方式比较好啊cursorlocation如何用ENVI把不同图像中的相同地点的某个像素点的值读出来。按时间把这个点的值连起来,。谢谢好人。泛微协同办公系统泛微软件怎么样?做协同办公的,我要来这做销售前景怎么样?请大家对这个行业或公司了解的给些建议。邮政网关中国邮政支付网关是不是不能在线开通支付宝充值了?
广州服务器租用 北京vps 187邮箱 云网数据 t楼 电影服务器 免费网站监控 hnyd ibrs 租空间 空间出租 softbank邮箱 北京双线 国外代理服务器软件 河南移动网 微软服务器操作系统 如何注册阿里云邮箱 沈阳主机托管 dnspod 电信宽带测速软件 更多