返回顶部
首页 > 资讯 > 精选 >Android中同步与异步的关系是什么
  • 334
分享到

Android中同步与异步的关系是什么

2023-06-19 09:06:22 334人浏览 八月长安
摘要

本篇文章为大家展示了Android中同步与异步的关系是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。android 只有UI线程可以刷新界面,其他副线程不行,这样就需要副线程通过通信消息修改刷新

本篇文章为大家展示了Android中同步与异步的关系是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

android 只有UI线程可以刷新界面,其他副线程不行,这样就需要副线程通过通信消息修改刷新和修改界面。 

有2方式可以实现: 
AsyncTask,Handle 
AsyncTask 
android提供的简单用于异步通讯的线程
主要四个实现接口: 
    onPreExecute(), 该方法将在执行实际的后台操作前被UI 线程调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条,或者一些控件的实例化,这个方法可以不用实现。 
    doInBackground(Params...), 将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台处理工作。可以调用 publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。 
    onProgressUpdate(Progress...),在publishProgress方法被调用后,UI 线程将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。 
    onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI 线程调用,后台的计算结果将通过该方法传递到UI 线程,并且在界面上展示给用户. 
    onCancelled(),在用户取消线程操作的时候调用。在主线程中调用onCancelled()的时候调用。 

调用注意 
1) Task的实例必须在UI 线程中创建 
2) execute方法必须在UI 线程中调用 
3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法,需要在UI线程中实例化这个task来调用。 
4) 该task只能被执行一次,否则多次调用时将会出现异常。
5)doInBackground方法返回值和onPostExecute的参数必须对应,这两个参数在AsyncTask声明的泛型参数列表中指定,第一个为doInBackground接受的参数,第二个为显示进度的参数,第第三个为doInBackground返回和onPostExecute传入的参数。 
可以看到这个线程有副线程的接口处理doInBackground,也有UI线程的接口处理onProgressUpdate,在启动线程时可以传入泛类参数。 

Handler 
Handler类可以看做工具类,用来向消息队列中插入消息的。实例化时自动绑定调用的线程Looper,当处理消息时在该线程中执行。利用这个特性,副线程发送消息,接受消息后在主线程处理,达到主线程和副线程的通讯。

在Android里可以这么理解,因为在android里你可以把UI界面当做主线程,你不能因为下载东西就一直显示下载,用户体验不好,也不被Google容许,所以你点击下载就是开启子线程去下载了,手机页面该看什么你就看什么,等下载好子线程就发个message给handler它来更新UI,在你的手机界面显示或弹出一个下载好了的消息,如果不用handler下载好了你也不知道,还得自己去看。Handler和Thread:子线程是不能更新UI的,所以用Thread开启子线程后,如果需要更新UI,就通过Handler来更新UI.

而AsyncTask 中:

doInBackground(Params…) 属于子线程,后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以 调用publicProgress(Progress…)来更新任务的进度。

onPostExecute(Result)  相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。 此方法在主线程执行,任务执行的结果作为此方法的参数返回

 
looper类是用来封装消息循环和消息队列的一个类。 
(1) Looper类用来为一个线程开启一个消息循环。 
    默认情况下android中新诞生的线程是没有开启消息循环的。(主线程除外,主线程系统会自动为其创建Looper对象,开启消息循环。) 
    Looper对象通过MessageQueue来存放消息和事件。一个线程只能有一个Looper,对应一个MessageQueue。
(2) 通常是通过Handler对象来与Looper进行交互的。Handler可看做是Looper的一个接口,用来向指定的Looper发送消息及定义处理方法。 
    默认情况下Handler会与其被定义时所在线程的Looper绑定,比如,Handler在主线程中定义,那么它是与主线程的Looper绑定。 
mainHandler = new Handler() 等价于new Handler(Looper.myLooper()). 
Looper.myLooper():获取当前进程的looper对象,类似的 Looper.getMainLooper() 用于获取主线程的Looper对象。 
(3) 在非主线程中直接new Handler() 会报如下的错误: 
E/AndroidRuntime( 6173): Uncaught handler: thread Thread-8 exiting due to uncaught exceptio
E/AndroidRuntime( 6173): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
原因是非主线程中默认没有创建Looper对象,需要先调用Looper.prepare()启用Looper。 
(4) Looper.loop(); 让Looper开始工作,从消息队列里取消息,处理消息。 
    注意:写在Looper.loop()之后的代码不会被执行,这个函数内部应该是一个循环,当调用mHandler.getLooper().quit()后,loop才会中止,其后的代码才能得以运行。 
(5) 基于以上知识,可实现主线程给子线程(非主线程)发送消息。 
    把下面例子中的mHandler声明成类成员,在主线程通过mHandler发送消息即可。 

总结,一般都是绑定主线程的handler,达到通讯目的,在副线程中发送消息。若要创建副线程中绑定handler,则必须先创建副线程的looper,已达到循环发送消息的目的。有两种方式达到这个目的: 
1、通过handler+Looper两个类。 
2、通过HandlerThread这个类,这个是android提供的利用Looper和Handler继承Thread完成。 

上述内容就是Android中同步与异步的关系是什么,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网精选频道。

--结束END--

本文标题: Android中同步与异步的关系是什么

本文链接: https://lsjlt.com/news/295242.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Android中同步与异步的关系是什么
    本篇文章为大家展示了Android中同步与异步的关系是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。android 只有UI线程可以刷新界面,其他副线程不行,这样就需要副线程通过通信消息修改刷新...
    99+
    2023-06-19
  • Python中同步与异步的区别是什么
    今天就跟大家聊聊有关Python中同步与异步的区别是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1. “同步”和“异步”是什么意思?Web 应...
    99+
    2024-04-02
  • java中同步与异步区别是什么
    一、同步与异步概念:(推荐:java视频教程)同步:所有的操作都做完,才返回给用户。这样用户在线等待的时间太长,给用户一种卡死了的感觉(就是系统迁移中,点击了迁移,界面就不动了,但是程序还在执行,卡死了的感觉)。这种情况下,用户不能关闭界面...
    99+
    2017-01-07
    java 同步 异步
  • java同步与异步的区别是什么?
    概念:同步:所有的操作都做完,才返回给用户。这样用户在线等待的时间太长,给用户一种卡死了的感觉(就是系统迁移中,点击了迁移,界面就不动了,但是程序还在执行,卡死了的感觉)。这种情况下,用户不能关闭界面,如果关闭了,即迁移程序就中断了。异步:...
    99+
    2015-05-13
    java教程 java 同步 异步
  • PHP同步与异步的区别是什么
    这篇文章主要介绍“PHP同步与异步的区别是什么”,在日常操作中,相信很多人在PHP同步与异步的区别是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP同步与异步的区别是什么”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-25
  • Python同步与异步有什么不同
    本文小编为大家详细介绍“Python同步与异步有什么不同”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python同步与异步有什么不同”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。“同步”和“异步”是什么意思?...
    99+
    2023-06-27
  • Python中的同步异步阻塞与非阻塞是什么
    今天小编给大家分享一下Python中的同步异步阻塞与非阻塞是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、状态介绍在...
    99+
    2023-07-05
  • ajax同步异步指的是什么
    本篇内容主要讲解“ajax同步异步指的是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ajax同步异步指的是什么”吧! ajax...
    99+
    2024-04-02
  • java中的异步交互与同步交互的区别是什么
    同步交互:指发送一个请求,需要等待返回,然后才能够发送下一个请求,有个等待过程。异步交互:指发送一个请求,不需要等待返回,随时可以再发送下一个请求,即不需要等待。免费视频教程推荐:java免费视频教程两者区别:一个需要等待,一个不需要等待,...
    99+
    2022-04-30
    java入门 java 异步交互 同步交互 区别
  • java异步转同步的方法是什么
    Java中实现异步转同步的方法有多种,下面列举了几种常用的方法。 使用CountDownLatch: CountDownLatch...
    99+
    2023-10-24
    java
  • java异步和同步的区别是什么
    这篇文章主要介绍“java异步和同步的区别是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“java异步和同步的区别是什么”文章能帮助大家解决问题。区别异步和同步的区别一般是调用方是否需要等待结果...
    99+
    2023-06-30
  • Java中的同步与异步的概念
    这篇文章主要讲解了“Java中的同步与异步的概念”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中的同步与异步的概念”吧!一.进程同步及异步的概念1.进程同步:就是在发出一个功能调用时...
    99+
    2023-05-30
    java
  • java中什么是进程同步与同步传输
    进程同步就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。也就是必须一件一件事做,等前一件做完了才能做下一件事。比如:早上起床后,先洗涮,然后才能吃饭,不能在洗涮没有完成时,就开始吃饭。按照这个定义,其实绝大多数函数都是同步调用...
    99+
    2019-04-05
    java基础 java 进程同步 同步阻塞
  • React 中的 setState 是同步还是异步
    setState 是同步还是异步?肯定是异步的呀。 确定么?那看一下这段代码会打印什么: import { Component } from 'react'; class Dong ...
    99+
    2024-04-02
  • Vue中的同步和异步调用顺序是什么
    今天小编给大家分享一下Vue中的同步和异步调用顺序是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Vue的同步和异步调用...
    99+
    2023-06-28
  • React组件的创建与state同步异步方法是什么
    这篇文章主要介绍“React组件的创建与state同步异步方法是什么”,在日常操作中,相信很多人在React组件的创建与state同步异步方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”React组件...
    99+
    2023-07-05
  • PHP同步与异步的区别
    本文操作环境:Windows7系统、PHP7.1版、DELL G3电脑PHP同步与异步的区别同步:多个任务之间有先后顺序执行, -个执行完下个才能执行。异步:多个任务之间没有先后顺序, 可以同时执行,有时候一个任务可能要在必要的时候获取另一...
    99+
    2019-07-12
    PHP
  • node.js中的forEach()是同步还是异步呢
    node里几乎所有用到回调函数的地方,都是异步的,回调函数后面的代码很可能比回调函数中的代码后先执行,特别是数据库操作。当然,node也提供了同步版本的函数,例如文件操作,fs.readFileSync()...
    99+
    2022-06-04
    node js forEach
  • ASP.NET MVC涉及到的5个同步与异步分别是什么
    ASP.NET MVC涉及到的5个同步与异步分别是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Action方法的执行具有两种基本的形式,即同步执行和异步执行,而在ASP....
    99+
    2023-06-17
  • Redux中异步action与同步action的使用
    异步action action:Object{} => 同步actionaction:function() => 异步action  同步action异步act...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作