android--多线程,android多线程

线程的基本用法:

android多线程编程其实并不比java多线程特殊,基本都是使用相同的语法,比如说,定义一个线程只需要新建一个类继承自Thread,然后重写父类的run()方法,并在里面编写耗时的逻辑即可,

public classMyThread extends Thread {

@Overridepublic voidrun() {//处理具体的逻辑

super.run();

}

}

如何启动这个线程,其实也很简单,只需要new出MyThread的实例,然后调用它的start()方法,这样run()方法中的代码就会在子线程当中运行了。

new MyThread().start();

使用继承的方式耦合性有点高,更多的时候我们都会选择使用Runnable接口的方式定义一个线程

public classMyThread implements Runnable{

@Overridepublic voidrun() {//处理具体的逻辑

}

}

如果使用了这种写法,启动线程的方法也需要进行相应的改变,

MyThread mythread=new MyThread();

new Thread(mythread).start();

当然如果不想专门再定义一个类去实现runnable接口,也可以使用匿名累的方式,如下所示:

Thread thread= new Thread(newRunnable() {

@Overridepublic voidrun() {//具体处理逻辑

}

}).start();

再子线程中更新UI

和许多其他GUI库一样,安卓的UI也是线程不安全的,也就是说,如果想要更新应用程序里的UI元素,则必须在主线程中进行,否则就会出现异常。

下面我们来看一个例子:

android:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/change_text"android:text="send request"/>

android:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/text1"android:text="hello world"android:textSize="20sp"

/>

public classMainActivity extends Activity implements View.OnClickListener {privateTextView textView;privateButton changeText;

@Overrideprotected voidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

textView=(TextView)findViewById(R.id.text1);

changeText=(Button)findViewById(R.id.change_text);

changeText.setOnClickListener(this);

}

@Overridepublic voidonClick(View v) {switch(v.getId()){caseR.id.change_text:new Thread(newRunnable() {

@Overridepublic voidrun() {

textView.setText("Nice to neet you");

}

}).start();break;default:break;

}

}

运行的时候会出现如下图所示的情况:

a8d709b6bf0ac986be7d8fe87352a72c.png

由此正式了安卓确实是不允许自线程中运行UI操作,但是有时候我们必须在子线程里面去执行一些耗时任务,然后根据任务的执行结果来更新相应的UI控件,

安卓提供了一套异步消息处理机制完美的解决了在子线程中运行UI操作。

首先我们先来看一下这个解决的代码

public classMainActivity extends Activity implements View.OnClickListener {privateTextView textView;privateButton changeText;public static final int UPDATE_TEXT=1;private Handler handler=newHandler() {

@Overridepublic voidclose() {

}

@Overridepublic voidflush() {

}

@Overridepublic voidpublish(LogRecord record) {

}public voidhandleMessage(Message msg){switch(msg.what){caseUPDATE_TEXT:

textView.setText("Nice to meet you");break;default:break;

}

}

};

@Overrideprotected voidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

textView=(TextView)findViewById(R.id.text1);

changeText=(Button)findViewById(R.id.change_text);

changeText.setOnClickListener(this);

}

@Overridepublic voidonClick(View v) {switch(v.getId()){caseR.id.change_text:new Thread(newRunnable() {

@Overridepublic voidrun() {

Message message=newMessage();

message.what=UPDATE_TEXT;

handler.sendMessage(message);

}

}).start();break;default:break;

}

}

我们来解析异步消息处理机制:

安卓中的异步消息处理主要由四部分组成,Message,Handler,MessageQueue和Looper。

1 Message

Message是在线程之间传递的消息,它可以在内部携带少量的信息,用于在不同线程之间交换数据。

2 Handler

Handler故名思义也就是处理者的意思,它主要是用于发送和处理消息的,发送消息一般是使用Handler的sendmessage()方法,而发出的消息经过一系列地辗转处理后,最终会传递到Handler地handleMessage()方法中,

3MessageQueue

MessageQueue 是消息队列的意思,它主要用于存放所有通过Handler发送的消息,这部分消息会一直存在于消息队列中,等待被处理,每个线程中只会有一个MessageQueue对象。

4 Looper

Looper是每个线程中的MessageQueue的管家,调用Looper的loop()方法后,就会进入到一个无限循环当中,然后每当发现MessageQueue中存在一条消息,就会将它取出,并传递到Handler的handleMessage()方法中,每个线程中也只会只有一个Looper对象。

首先需要在主线成中创建一个Handler对象,并重写handleMessage()方法,然后子线程中需要进行UI操作时,就创建一个Message对象,并通过Handler将这条消息发送出去,之后这条消息会被添加到MessageQueue的队列中等待被处理,而Looper则会一直尝试从MessageQueue中取出待处理消息,最后奋发回Handler的handleMessage()方法中,由于Handle是在主线程中创建的,所以此时handleMessage()方法中的代码也会在主线成中运行,于是我们在这里就可以安心的运行UI操作,整个异步消息处理的核心思想就是这样。5363eeed835069f2966181ebccf2d31e.png

为了更加方便我们在自线程中对UI进行操作,android还提供了另外的一些好用的工具,AsyncTask就是其中之一,借助AsyncTask,即使你对异步消息处理机制完全不了解,也可以十分简单的从子线程切换的主线程,AsyncTask背后的实现原理也是基于异步消息处理机制的。

由于AsyncTask是一个抽象类,所以如果我们想要使用它,就必须创建一个子类去继承它,在继承AsyncTask类指定三个范性参数,这三个参数的用途如下:

1 params

在执行AsyncTask时需要传入参数,用于在后台任务中使用。

2progress

后台任务执行时,如果需要在界面上显示当前的进度,则使用这里指定的范性作为进度单位。

3 result

当任务执行完毕后,如果需要对结果进行返回,则使用这里指定的泛型作为返回类型。

我们还需要自定义一些方法才能完成对任务的定制。

1 onPreExecute()

这个方法会在后台任务开始执行之前调用,用于进行一些界面上的初始化操作,比如显示一个进度条对话框

2 doInBackground(Params...)

这个方法中所有代码都会在自线程中运行,我们应该在这里去处理所有的耗时任务,任务一旦完成就可以通过return语句来将任务的执行结果返回,如果AsyncTask的读三个泛型参数指定的是void,就可以不返回任务执行结果,注意,在这个方法中是不可以进行ui操作的,如果要更新UI元素,比如说反馈当前任务的执行进度,可以调用publishProgress(Progress...)方法来完成。

3 onProgressUpdate(Progress...)

当在后台任务中调用了publishprogress(progress...)方法后,这个方法就会很快被调用,方法中携带的参数就是在后台任务传递过来的,在这个方法中可以对UI进行操作。利用参数中的数值就可以对界面元素进行相应的更新。

4 onPostExecute(Result)

当后台任务执行完毕并通过return语句进行返回时,这个方法就很快会被调用,返回的数据会作为位参数传递到此方法中,可以利用返回的数据来进行一些UI操作,比如说提醒任务执行的结果以及关闭掉进度条对话框。

如果要启动的话只需要调用其execute()方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/557482.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java数据库篇9——备份与还原、忘记密码

Java数据库篇9——备份与还原、忘记密码 1、备份 备份的应用场景 在服务器进行数据传输、数据存储和数据交换,就有可能产生数据故障。比如发生 意外停机或存储介质损坏。 这时,如果没有采取数据备份和数据恢复手段与措施,就会导致数据的丢 …

android的ui怎么做到流畅,android提高UI的流畅度

android提高UI的流畅度Android中所有的界面绘制工作都是在UI线程中进行的,提高UI流畅度的最核心根本在于释放UI线程。即:不在主线程中做耗时的操作。很多人都知道,耗时的操作要放到子线程中去做,比如访问网络,比如读写sd卡。像这类…

android uboot log,RK3288 Android 8.1系统uboot logo过渡到kernel logo会花一下

在调试RK3288 Android 8.1系统遇到一个问题:开机启动uboot logo过渡到kernel log的过程中会花掉直到没有显示,再出现kernel logo。分析:打印串口log时发现,uboot阶段显示一切正常,进入kernel以后就开始花掉了然后变成没…

Java JDBC篇1——初识JDBC

Java JDBC篇1——初识JDBC Java DataBase Connectivity Java 数据库连接(Java语言操作数据库) 1、什么是JDBC 其实是官方定义的一套操作所有关系型数据库的规则(接口),各个数据库厂商去实现这套接口,提供…

android socket 框架c#,C#与Android Socket通信

【实例简介】C#做服务器,Android做客户端,实现Socket通信【实例截图】【核心代码】C与Android-Socket通信-yu└── C#与Android-Socket通信├── MySocketServer│ ├── MySocketServer│ │ ├── bin│ │ │ └── Debug│ │ …

Java JDBC篇2——JDBC增删查改

Java JDBC篇2——JDBC增删查改 urljdbc:mysql://localhost:3306/test userroot passwordblingbling123. drivercom.mysql.jdbc.Driverpublic class JDBCtool {private static String urls;private static String user;private static String password;private static String d…

android商品数量加减,微信小程序实现一个简单的商品数量加减案例

简介这是一个用微信小程序原生代码实现的数量加减demo,主要是用于商品购物车或者商品详情修改数量使用,很简单哦~~~。核心js方法说明addCount(增加数量)delCount (减少数量)getCount(获取数量)实现效果如下图所示:微信小程序实现一个简单的商…

Java JDBC篇3——JDBC事务

Java JDBC篇3——JDBC事务 1、事务方法 方法声明功能介绍void setAutoCommit(boolean autoCommit)参数是 true 或 false 如果设置为 false,表示关闭自动提交,相当于开启事务void commit()提交事务void rollback()回滚事务 2、步骤 获取连接开启事务获…

signature=1610c03482e0c6557f7ec99f0ceeae85,Vpdes Permit No. Va006557

摘要:PARK 500 4100. BERMUDA HUNDRED ROAD, CHESTER, VIRGINIA 23831 TELEPHONE (804) 751-2000 March 3, 1992 Mr. A. C. Ray Virginia Water Control Board Piedmont Regional Office P. 0. Box 11143 Richmond, Virginia 23230 Subject: VPDES Permit No. VA00…

Java JDBC篇4——数据库连接池

Java JDBC篇4——数据库连接池 1、DBCP 1.1、依赖jar包 官网:https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 mysql-connector-java-5.1.49.jar 百度云:https://pan.baidu.com/s/17J2VfkGS2h44j69eB8TuFA提取码:n…

android plugin 镜像,cordova-plugin-screen-orientation

标题说明屏幕方向设置屏幕方向AppVeyor Travis CI Cordova屏幕方向插件Cordova插件以通用方式为 iOS。安卓和 windows UWP设置/锁定屏幕方向。 这个插件基于屏幕定向 API,所以API是当前的规范。插件将以下内容添加到屏幕对象( window.screen ):// lock the device o…

JAVA WEB篇1——初识JAVAWEB

JAVA WEB篇1——初识JAVAWEB JavaWeb主要指使用Java语言进行动态Web资源开发技术的统称,是解决相关Web互联网领域的技术总和 1、Http协议 HTTP协议(HyperText Transfer Protocol,超文本传输协议)是由W3C(万维网联盟…

osgi框架 android,基于OSGi的Android应用模块动态加载框架设计与实现

摘要:伴随着移动互联网科技水平向4G的飞跃,移动终端的使用日趋常态化,移动智能设备的普及率越来越高,得到了大量使用者的追捧。与此同时,各手机操作系统下应用商店里正充斥着琳琅满目的移动应用产品,用户对移动应用软件的期望值在逐步攀升,人们对移动应用软件的功能…

JAVA WEB篇2——Servlet

JAVA WEB篇2——Servlet Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,是Java语言编写 的服务器端程序,换句话说,Servlet就是运行在服务器上的Java类。 Servlet用来完成B/S架构…

前台为html后台是asp在vs2012中建立什么,Asp.net中后台*.cs与前台JS脚本之间相互调用的几点心得...

Asp.net中后台*.cs与前台JS脚本之间相互调用的几点心得< type"text/javascript"> < type"text/javascript">一、 经 常需要在asp.net中“后台代码*.cs文件中调用javascript脚本中已经定义好的脚本函数”。基本包括一下几种办法&#xff1a;1. …

JAVA WEB篇3——JSP

JAVA WEB篇3——JSP 1、JSP是什么 JSP是Java Server Pages的简称&#xff0c;跟Servlet一样可以动态生成HTML响应&#xff0c; JSP文件命名为 xxx.jsp 与Servlet不同&#xff0c;JSP文件以HTML标记为主&#xff0c;然后内嵌Java代码段&#xff0c;用于处理动态内容 <% p…

JAVA WEB篇4——Filter、Listener

JAVA WEB篇4——Filter、Listener 1、Filter Filter本意为”过滤“的含义&#xff0c;是JavaWeb的三大组件之一&#xff0c;三大组件为&#xff1a;Servlet、Filter、 Listener过滤器是向 Web 应用程序的请求和响应处理添加功能的 Web 服务组件过滤器相当于浏览器与Web资源之…

html如何设置滚动条居中,css3内容垂直居中及垂直滚动条例子

垂直居中用得不少了&#xff0c;我在学习css3中也就碰到过了&#xff0c;在此小编就来为各位介绍css3内容垂直居中及垂直滚动条例子&#xff0c;希望文章对各位有帮助。内容垂直集中相对于内容在水平位置&#xff0c;内容在垂直方向是不好把控的&#xff0c;尤其当考虑到滚动条…

Java SSM1——Maven

Java SSM1——Maven 1、下载 maven 官网&#xff1a;https://maven.apache.org/download.cgi maven 百度云&#xff1a;https://pan.baidu.com/s/18XKbJp7P5x_BkKyc0VF0tw提取码&#xff1a;4zr9 2、安装 解压到想安装的目录下 添加环境变量 添加MAVEN_HOME变量 MAVEN_HO…

2021年广西艺术高考成绩查询,2021年广西美术高考成绩查询网址:https://www.gxeea.cn/...

【导语】2021年广西美术高考成绩查询入口开通后&#xff0c;考生可登录广西教育考试院(https://www.gxeea.cn/)高考服务平台或点击下方链接进入广西美术考成绩查询系统。具体如下&#xff1a;2021年广西美术高考成绩查询入口开通后&#xff0c;考生可以通过黑龙江教育考试院(ht…