Android 多线程编程
Android 多线程编程
文章目录
线程的调用
实现Runnable接口定义一个线程
使用匿名内部类的方法启动子线程
在子线程中更新主线程参数
异步信息处理机制
使用异步信息处理机制
解析异步信息处理机制
AsyncTask
使用AsyncTask
线程的调用
实现Runnable接口定义一个线程
class MyThread implements Runnable
{
@Override public void run() { //处理具体的逻辑 }
}
启动MyThread
MyThread myThread = new MyThread();
new Thread(myThread).start();
1
2
使用匿名内部类的方法启动子线程
new Thread(
new Runnable() { @Override public void run() { //处理具体的逻辑 } }
).start();
在子线程中更新主线程参数
子线程不能直接修改主线程中的变量,否者会出现异常。
异步信息处理机制
使用异步信息处理机制
首先定义一个整形常量UPDATE_DATA。
public static final int UPDATE_DATA = 1;
1
新增一个Handler对象,并重写父类的handleMessage()方法。
private Handler handler = new Handler()
{
public void handleMessage(Message msg) { switch (msg.what) { case UPDATE_DATA: //这里可以进行主线程中的变量操作 break; default: break; } }
}
在单击事件中开启子线程,在“具体的逻辑”执行完成后,创建一个Message对象,将Message对象的what字段的值指定为UPDATE_DATA,将Message对象发送出去。
很快,Handler就会收到这条Message,并在handleMessage()方法中对它进行处理。
new Thread(
new Runnable() { @Override public void run() { //处理具体的逻辑 Message message = new Message(); //创建一个Message对象 message.what = UPDATE_DATA; //将Message对象的what字段的值指定为UPDATE_DATA handler.sendMessage(message); //将Message对象发送出去 } }
).start();
解析异步信息处理机制
AsyncTask
对于在子线程中使用主线程中的变量,Android提供了一个更方便的工具:AsyncTask。
即使对异步消息处理机制完全不了解,也可以十分简单的从子线程切换到主线程。
使用AsyncTask
AsyncTask是一个抽象类,在继承时我们可以为AsyncTask类指定3个泛型参数。
Params:在执行AsyncTask时,需要传入的参数,可用于在后台任务中使用
Progress:后台任务执行时,如果需要再界面上显示当前进度,则使用这里指定的泛型作为进度单位。
Result:当任务执行完毕后,如果需要对结果进行返回,则使用这里指定的泛型作为返回值类型。
//Void:表示在执行AsyncTask的时候不需要传入参数给后台任务
//Integer:表示使用整型数据来作为进度显示单位
//Boolean:表示使用布尔型数据来反馈执行结果
class DownloadTask extends AsyncTask
{
...
}
重写AsyncTask中的几个方法,完成对任务的定制
doInBackground():中执行具体的耗时任务
onProgressUpdate():中进行主线程变量操作
onPostExecute():中做执行一些任务的收尾工作
class DownloadTask extends AsyncTask
{
@Override protect void onPreExecute() { /* *这个方法会在后台任务开始执行之前调用, *用于进行一些界面上的初始化操作, *比如显示一个进度条对话框等。 */ } @Override protect Boolean doInBackground(Void ... params) { /* *这个方法中的所有代码都会在子线程中运行,我们应该在这里去处理所有耗时任务。 *任务一旦完成,就可以通过return语句来将任务的执行结果返回。 *如果AsyncTask的第三个泛型参数指定的是Void,则可以不返回任务执行结果。 * *在这个方法中不可以对主线程的变量进行操作。 */ //用于调用opProgressUpdate()方法 publishProgress(Progress ...); } @Override protect void onProgressUpdate(Integer ... values) { /* *当后台任务中调用了publishProgress(Progress ...)方法后, *onProgressUpdate(Progress ...)方法很快就会被调用。 *该方法中携带的参数是在后台任务中传递过来的。 * *在这个方法中可以对主线程的变量进行操作。 */ } @Override protect void onPostExecute(Boolean result) { /* *当后台任务执行完毕,并通过return语句进行返回时, *这个方法很快就会被调用。 *返回的数据会作为参数传递到此方法中, *可以利用返回的数据做一些对主线程变量的操作。 */ }
}
如果想要启动这个任务,只需要编写以下代码即可:
new DownloadTask().execute();
作者:zzsj1990
来源:CSDN
原文:https://blog.csdn.net/zzsj1990/article/details/90767742
版权声明:本文为博主原创文章,转载请附上博文链接!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Android获取SD卡路径/内存的几种方法
Android获取SD卡路径/内存的几种方法Android获取SD卡路径 本篇将会带领大家学习如何获取android路径的几种常见用法,但在我开始bb之前需要大家清楚android中内存和外存之间的区别,下面进行简短介绍:android中的内存:保存在内存中的程序和文件是相互关联的,什么意思呢?举个例子,假设你android手机内存中有一个程序叫bb,然后由bb程序创建了一份名叫cc的文件,当你删除bb的时候cc也会应为关联而被删除。像是Shared Preferences或SQLite的内容就是保存到内存储中的,这些保存的内容会随程序的删除而删除用过的同学因该很快能理解。 android中的外存:我们平常在android手机使用的最多的就是外部存储,像是你用相机拍了一张照片,这些一般都是保存到外存中的,这些文件不会因为你删除了程序而不见。 随着android版本的增加一般所谓的sd卡(外存储卡)都变成内置的了 下面正式开始介绍,先是获取SD卡根目录的方法: 添加权限: 12if(Environment.getExternalStorageState().equals(Environm...
- 下一篇
espresso框架
一、espresso简介espresso是google官方推出的ui自动化框架,可以用来做单元测试和自动化测试。 官方说明文档:https://developer.android.com/training/testing/espresso/ 官方中文文档:https://lovexiaov.gitbooks.io/official-espresso-doc/content/ 优点: 1、代码风格简洁,非常易学 2、api非常小 3、Espresso 的测试跑起来很快 4、官方的框架,android studio支持 5、适用于白盒&黑盒自动化 缺点: 1、不能跨app运行 2、定位TabLayout中的tab时,由于它们拥有相同的类型和id,难以定位view 3、不能进行改变屏幕方向的操作 二、espresso组成Espresso 由 3 个主要的组件构成 **ViewMatchers:查找view,通过onView()在当前层级中定位出viewViewActions:与view交互,通过perform()对view执行某种操作 ViewAssertions:为view设置断言...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7设置SWAP分区,小内存服务器的救世主
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Docker快速安装Oracle11G,搭建oracle11g学习环境