Android备注26.Android异步任务(AsyncTask)
能够在该方法中做一些准备工作,如在界面上显示一个进度条,或者一些控件的实例化,这种方法能够不用实现。
方法运行后立即运行,该方法运行在后台线程中。这里将主要负责运行那些比較耗时的后台处理工作。能够调用 publishProgress()方法来实时更新任务进度。该方法是抽象方法,子类必须实现。
线程将调用这种方法从而在界面上展示任务的进展情况,比如通过一个进度条进行展示。
运行完毕后。onPostExecute 方法将被UI线程调用,后台的计算结果(doInBackground方法返回值)将通过该方法传递到UI线程,而且在界面上展示给用户。
onPostExecute(Result),doInBackground(Params...),onProgressUpdate(Progress...)这几个方法。须要在UI线程中实例化这个task来调用;
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjYzNzUwMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" width="474" height="365" alt="" style="background-color:inherit; display:inline-block; margin-top:8px; width:473.75846501128666px; height:365px">
package com.example.android_asynctask;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
public class MainActivity extends Activity {
private Button downbtn;
private TextView textView;
private ProgressBar progressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
downbtn = (Button)findViewById(R.id.download);
textView = (TextView)findViewById(R.id.text);
progressBar = (ProgressBar)findViewById(R.id.progressBar);
final DownloadTest download = new DownloadTest(textView,progressBar); //获取一个DownloadTest对象。并传递组件对象參数
downbtn.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v) {
download.execute(200);
}
}); }
}
package com.example.android_asynctask;
import android.graphics.Color;
import android.os.AsyncTask;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.TextView;
public class DownloadTest extends AsyncTask<Integer,Integer,String>
{
private TextView tv;
private ProgressBar pb;
//带參数构造方法
DownloadTest(TextView text,ProgressBar bar)
{
this.tv = text;
this.pb = bar;
}
//不带參数构造方法
DownloadTest()
{
}
/*1.onPreExecute方法
* 为子线程(后台)执行初始化相关内容
*/
protected void onPreExecute() {
tv.setVisibility(View.VISIBLE); //设置显示文本组件
pb.setVisibility(View.VISIBLE); //设置显示运行进度条
super.onPreExecute();
}
/*2.doInBackground方法
* 执行一个后台线程,该线程实现每arg0[0]毫秒调用一次onProgressUpdate方法
*/
protected String doInBackground(Integer... arg0) {
for(int i=0;i<100;i++)
{
publishProgress(i); //调用onProgressUpdate方法并传递參数i
try {
Thread.sleep(arg0[0]); //累加一次,线程休眠argo[0]毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return "完成下载"; //后台子线程执行完成后。返回的值
}
/*3.onProgressUpdate方法
* 调用publishProgress(i)时调用该方法,并传递參数i给形參values[0]*/ @Override
protected void onProgressUpdate(Integer... values) {
pb.setProgress(values[0]); //设置进度条值
tv.setText("已经下载"+values[0]+"%"); //文本组件显示提示信息
super.onProgressUpdate(values);
}
/*4.onPostExecute
* 处理后台线程得到的结果
* */
protected void onPostExecute(String result) {
pb.setVisibility(View.INVISIBLE); //隐藏进度条
tv.setVisibility(View.VISIBLE); //显示UI文本显示框组件
tv.setText(result);
tv.setTextSize(20);
tv.setTextColor(Color.RED);
super.onPostExecute(result);
}
}
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjYzNzUwMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

然后,在新创建的子线程中调用doInBackground()方法实现后台线程功能并通过publishProgress()方法调用onProgressUpdate()方法更新UI内容,最后在主线中执行onPostExecute方法来处理后台线程执行的结果。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjYzNzUwMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" width="386" height="250" alt="" style="background-color:inherit; display:inline-block; margin-top:8px; width:385.8520900321543px; height:250px">
版权声明:本文博客原创文章,博客,未经同意,不得转载。
Android备注26.Android异步任务(AsyncTask)的更多相关文章
- Android多线程分析之五:使用AsyncTask异步下载图像
Android多线程分析之五:使用AsyncTask异步下载图像 罗朝辉 (http://www.cnblogs.com/kesalin) CC 许可,转载请注明出处 在本系列文章的第一篇<An ...
- Java基础知识强化之网络编程笔记15:Android网络通信之 Android异步任务处理(AsyncTask使用)
AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的 ...
- Android 之异步任务(AsyncTask,Handler,Message,looper)
AsyncTask: 3个类型(Params,Progress和Result),4个步骤(onPreExecute(),doInBackground(Params…),onProgressUpdate ...
- Android中使用Thread线程与AsyncTask异步任务的区别
最近和几个朋友交流Android开发中的网络下载问题时,谈到了用Thread开启下载线程时会产生的Bug,其实直接用子线程开启下载任务的确是很Low的做法,那么原因究竟如何,而比较高大上的做法是怎样? ...
- android:异步任务asyncTask介绍及异步任务下载图片(带进度条)
为什么要用异步任务? 在android中仅仅有在主线程才干对ui进行更新操作.而其他线程不能直接对ui进行操作 android本身是一个多线程的操作系统,我们不能把全部的操作都放在主线程中操作 .比方 ...
- Android异步载入AsyncTask具体解释
曾看见有人说过.认为非常有道理.分享一下: 技术分为术和道两种: (1)具体做事的方法是术. (2)做事的原理和原则是道. 近期项目发现个重大问题.结果打log跟踪查是AsyncTask导 ...
- Android 旋转屏幕--处理Activity与AsyncTask的最佳解决方案
一.概述 运行时变更就是设备在运行时发生变化(例如屏幕旋转.键盘可用性及语言).发生这些变化,Android会重启Activity,这时就需要保存activity的状态及与activity相关的任务, ...
- Android实战技巧:深入解析AsyncTask
AsyncTask的介绍及基本使用方法 关于AsyncTask的介绍和基本使用方法可以参考官方文档和Android实战技巧:多线程AsyncTask这里就不重复. AsyncTask引发的一个问题 上 ...
- Android异常一、异步任务导致的窗口句柄泄漏问题(转)
05-05 10:36:41.009: E/WindowManager(4243): Activity com.tao.MyActivity has leaked window com.android ...
随机推荐
- Swift 中异常抛出和四种异常处理
在Swift中你可以像其他语言一样抛出异常处理异常,今天我们就详细地说说Swift中的异常抛出和处理. 在一开始我们要定义错误或者说是异常,Swift中的一些简单异常可以使用枚举定义,注意这个枚举要继 ...
- Node.js v10.1.0 Documentation
Modules Stable 在 Node.js 模块系统中,每个文件都会被当做一个独立的模块.假设有一个名为 foo.js: const circle = require('./circle.js' ...
- COCOS2D-X 3.0在MAC下创建新IOS项目:
首先进入:CocoStudio\Source\3.0\cocos2d-x\tools\cocos2d-console\bin 运行 ./cocos new -p com.aaaa -l cpp MyG ...
- 【Nutch2.2.1基础教程之3】Nutch2.2.1配置文件 分类: H3_NUTCH 2014-08-18 16:33 1376人阅读 评论(0) 收藏
nutch-site.xml 在nutch2.2.1中,有两份配置文件:nutch-default.xml与nutch-site.xml. 其中前者是nutch自带的默认属性,一般情况下不要修改. 如 ...
- Django表单上传
任务描述:实现表单提交(上传文件) 1.项目目录: 2.源代码: regist.html <!DOCTYPE html> <html lang="en"> ...
- 开发文档生成工具----强大的Doxygen工具使用手册
张三:假如我们自己开发了一个类库,怎么做一个方便阅读的文档呢? 李四:一个方法一个方法地写呗,就像写Excel文档一下. 张三:啊,你out了,这多慢呀.为什么不玩玩doxygen工具,它能帮你生成文 ...
- 【Python 安装】安装第三方库时 PermissionError: [WinError 5] Access is denied
对于 windows 用户,在开始菜单中输入 cmd,右键以 run as administrator(以管理员身份运行). Python - PIP install trouble shooting ...
- 数组replaceObjectAtIndex
执行replaceObjectAtIndex方法前提是_temp_Array必须是可变数组 [_temp_Array replaceObjectAtIndex:2 withObject:tempDat ...
- 推荐一款软件mybatis-generator-gui
https://github.com/zouzg/mybatis-generator-gui mybatis-generator-gui mybatis-generator-gui是基于mybatis ...
- Qt多线程和GUI界面假死(run()是线程的入口,就像main()对于应用程序的作用。分析QThread::exec函数的源码,旧的QMutexLocker模式其实很好用,挡住别人进入抢占资源,可照抄)good
QThread的常见特性: run()是线程的入口,就像main()对于应用程序的作用.QThread中对run()的默认实现调用了exec(),从而创建一个QEventLoop对象,由其处理该线程事 ...