android异步处理AsyncTask

相信不少攻城狮觉得另开一个类写线程肯定觉得特别麻烦 代码也繁琐 毕竟不能写在主线程中 主线程只用来刷新一些ui页面 但AsyncTask就不同了 可以写在主线程中 不会造成程序崩溃 是谷歌为了解决Thread复杂麻烦出了一个解决方案  这里我就简单讲两个例子


主要是理解才可以灵活应用 我这里先讲一个数字增长从0到100使用到AsyncTask线程后台运行 为了显示出效果使用到线程休眠 这里先部署一下包的布局和xml 文件

第一个为功能清单 一些权限sdk等在这里设置

MainActivity是我第一个讲的内容ReadText 读取设备存储的一个txt文件 ReadInt 是读取网路数据的一个java

android异步处理AsyncTask_第1张图片
图片发自App
android异步处理AsyncTask_第2张图片
图片发自App

然后看一下我的xml 代码 我这里选的线性布局 你可以根据爱好和每个布局的特色来设计布局 这里我就写了两个控件 TextView和Button 我为了方便没把文字写到数组中 根据需要自己去添加

android异步处理AsyncTask_第3张图片
图片发自App

然后来看我的java文件 先照顾一下一些小白吧 第一行为你的包名

import 是调用api文件 以第一个为例 调用 安卓包下的APP的activity

然后公开的class 继承于Activity

简单的声明控件 格式为private 控件总称 你想定义的名字

这里是activity的生命周期onCreate返回一个保存过的缓存数据 具体生命周期建议去谷歌官网查看

设置上下文示图 res下的布局的布局id

绑定控件id 和按钮设置监听 按钮设置点击监听建议使用这个 不建议使用xml中指明点击监听 在一些手机可能会出问题

在这里我设置了按钮点击后就不可以再点击了 设置Enabled 为假

调用我的MyTask方法 下面会写出来具体的实现

android异步处理AsyncTask_第4张图片
图片发自App

这里具体写了一个MyTask 继承于AsyncTask 如果你要设置其他的类可以访问可以添加public公开private自身包访问 protected只有这个方法才可以访问

首先写出来这个方法 必须生成一个方法 叫doInBackground后台运行的方法 你可以右击生成方法 或者点红色感叹号自动补全代码实现方法

onPreExecute准备工作做的事情 我加了一个设置文本用来提示用户正在加载

然后后台运行的工作是数字自增加 注意 一定不要把ui刷新写在这里 否则会崩溃

android异步处理AsyncTask_第5张图片
图片发自App

加入一个线程 防止自增长过快 看不出来效果

用try 方法包围

最后无法实行的结果 返回一个空值

进展更新调用的方法 定义int类型的值 文本设置得到的数字

android异步处理AsyncTask_第6张图片
图片发自App

最后进程结束的工作 进程完成自动调用这个方法 我写了两个提示 一个Toast一个文本改成执行完毕

android异步处理AsyncTask_第7张图片
图片发自App

效果图就不示范了 本人确保代码可以正确运行 有不懂的可以来问我

下面开始讲第二个示例 来获取手机存储设备的一个txt文件 建议自己写一个文件来实践 直接放到手机存储中即可 你也可以使用完毕删除他 我的文件名叫做testText.txt

1同样先来示例我的布局截图自己xml代码

android异步处理AsyncTask_第8张图片
图片发自App

这里加了一个按钮用来读取文件 然后还有一个ProgressBar用来显示进度 EditText用来显示获取的文件


android异步处理AsyncTask_第9张图片
图片发自App

前面已经讲过这个了 这里就不多讲了

android异步处理AsyncTask_第10张图片
图片发自App

按钮点击监听实现指明路径 开启一个新的AsyncTask 注意括号里的代码 路径 整数 string数组

注意需要指明路径的正确位置 环境 得到存储设备 文件名

下面调用的方法也已经讲过 有不明白的去上面看一下

android异步处理AsyncTask_第11张图片
图片发自App

主要是在自己写这个读的方法 得到数组 初始化 为了提示用户得到数据写了两个长度来给进度条显示进程

缓冲读取器的初始化

下面尝试读取文件 初始化缓冲读取器 输出流读取 路径输出读取 路径名字file 前面已经定义过路径的地址 编码格式为GBK 可以根据自己情况而定 得到缓冲读取器中的读取行

android异步处理AsyncTask_第12张图片
图片发自App

需要判断文件中是否有行内容 当不为空执行查询 stringBuilder动态数组添加获取到的内容加换行符号 读取长度叠加等于文件得到字节的长度 定义一个int值用来公布汇报进程 同样休眠0.1秒 行等于缓冲读取器的读取行 返回数组 下面是防止找不到文件 或已经读取完毕等意外情况的优化 自动生成代码


android异步处理AsyncTask_第13张图片
图片发自App

最后 尝试如果缓冲读取器不为空值 需要关闭缓冲读取器 否则内存泄露 会影响用户体验的性能 否则出问题返回空值 思路要严谨

线程更新的时候将得到的长度解析设置到进度条上显示

最容易忽略的一步 在功能清单上注册读取内存卡的权限

android异步处理AsyncTask_第14张图片
图片发自App

到这里我们的优化讲解就已经讲完了 我把所有用到的数据都公布在这里了 如果还有不懂的 点个小心心送给小编 不给我也可以讲述 不给就是小编讲的不够完美嘛

这么晚了 我也要洗洗睡了

你可能感兴趣的:(android异步处理AsyncTask)