没有合适的资源?快使用搜索试试~ 我知道了~
Android AsyncTask使用以及源码解析
0 下载量 160 浏览量
2021-01-05
19:55:32
上传
评论
收藏 110KB PDF 举报
温馨提示
综述 在Android中,我们需要进行一些耗时的操作,会将这个操作放在子线程中进行。在子线程操作完成以后我们可以通过Handler进行发送消息,通知UI进行一些更新操作(具体使用及其原理可以查看Android的消息机制——Handler的工作过程这篇文章)。当然为了简化我们的操作,在Android1.5以后为我们提供了AsyncTask类,它能够将子线程处理完成后的结果返回到UI线程中,之后我们便可以根据这些结果进行一列的UI操作了。 AsyncTask的使用方法 实际上AsyncTask内部也就是对Handler和线程池进行了一次封装。它是一个轻量级的异步任务类,它的后台任务在线程池
资源推荐
资源详情
资源评论
Android AsyncTask使用以及源码解析使用以及源码解析
综述综述
在Android中,我们需要进行一些耗时的操作,会将这个操作放在子线程中进行。在子线程操作完成以后我们可以通过
Handler进行发送消息,通知UI进行一些更新操作(具体使用及其原理可以查看Android的消息机制——Handler的工作过程这
篇文章)。当然为了简化我们的操作,在Android1.5以后为我们提供了AsyncTask类,它能够将子线程处理完成后的结果返回
到UI线程中,之后我们便可以根据这些结果进行一列的UI操作了。
AsyncTask的使用方法的使用方法
实际上AsyncTask内部也就是对Handler和线程池进行了一次封装。它是一个轻量级的异步任务类,它的后台任务在线程
池中进行。之后我们可以将任务执行的结果传递给主线程,这时候我们就可以在主线程中操作UI了。
AsyncTask他是一个抽象的泛型类,所以我们创建一个子类,来实现AsyncTask中的抽象方法。AsyncTask中提供了三个
泛型参数,下面我们就来看一下这三个泛型参数.
1. Params:在执行AsyncTask时所传递的参数,该参数在后台线程中使用。
2. Progress:后台任务执行进度的类型
3. Result:后台任务执行完成后返回的结果类型。
对于以上三个泛型参数我们不需要使用的时候,可以使用Void来代替。与Activity生命周期类似,在AsyncTask中也为我
们提供了一些方法,我们通过重写这几个方法来完成整个异步任务。我们主要使用的方法有一下四个:
1. onPreExecute():该方法在异步任务工作之前执行,主要用于一些参数或者UI的初始化操作。
2. doInBackground(Params… params):该方法在线程池中执行,params参数表示异步任务时输入的参数。在这个方法中
我们通过publishProgress来通知任务进度。
3. onProgressUpdate(Progress… values):当后台任务的进度发生改变的时候会调用该方法,我们可以再这个方法中进行
UI的进度展示。values参数表示任务进度。
4. postResult(Result result):在异步任务完成之后执行,result参数为异步任务执行完以后所返回的结果。
在上面四个方法中只有doInBackground在子线程中运行,其余都三个方法都是在主线程中运行的。其中的…表示参数的
数量不定,是一种数组类型的参数。
下面我们就来写一个例子来看一下AsyncTask的用法,在这里我们就一个下载的功能,从网络上下载两个文件。我们先来
看一下效果演示。
效果演示
代码分析
由于我们做的下载任务,首先我们就得添加访问网络权限以及一些sd卡相关的权限。
<!-- 在SD卡中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 向SD卡写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!-- 授权访问网络 -->
<uses-permission android:name="android.permission.INTERNET"/>
下面我们来看一下Activity代码。
package com.example.ljd.asynctask;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private DownloadAsyncTask mDownloadAsyncTask;
private Button mButton;
private String[] path = {
"http://msoftdl.360.cn/mobilesafe/shouji360/360safesis/360MobileSafe_6.2.3.1060.apk",
"http://dlsw.baidu.com/sw-search-sp/soft/7b/33461/freeime.1406862029.exe",
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton = (Button)findViewById(R.id.button);
mButton.setOnClickListener(this);
}
@Override
protected void onDestroy() {
if (mDownloadAsyncTask != null){
mDownloadAsyncTask.cancel(true);
}
super.onDestroy();
}
@Override
public void onClick(View v) {
mDownloadAsyncTask = new DownloadAsyncTask();
mDownloadAsyncTask.execute(path);
}
class DownloadAsyncTask extends AsyncTask<String,Integer,Boolean>{
private ProgressDialog mPBar;
private int fileSize; //下载的文件大小
@Override
protected void onPreExecute() {
super.onPreExecute();
剩余7页未读,继续阅读
资源评论
weixin_38680625
- 粉丝: 3
- 资源: 968
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 代码审计知识点整理-Java.zip
- 从 Python 访问 Java 类.zip
- 交互式 JavaScript 沙箱.zip
- 交互式 JavaScript API 参考.zip
- 使用SSM框架的Java Web项目-电商后台管理.zip
- ffmpeg、ffplay、ffprobe
- 与 FrontendMasters 课程 JavaScript 和 React 模式相关的 repo.zip
- win11系统有ie浏览器,打开ie浏览器自动跳转edge浏览器解决方案
- 基于Spark的新闻推荐系统源码+文档说明(高分项目)
- 27个常用分布函数详细汇总-名称+类别+用途+概率密度曲线+公式-PPT版本
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功