• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > AsyncTask基础(笔记)

AsyncTask基础(笔记)

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了asynctask,asynctask的使用,android asynctask,asynctask.dll下载,asynctask原理等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

AsyncTask基础(笔记)


安卓异步任务 ---AsyncTask

为什么要异步任务:

1.Android单线程模型

2.耗时操作放在非主线程中执行


AsyncTask为何而生

1.子线程中更新UI

2.封装,简化异步操作


构造AsyncTask子类的参数

AsyncTask是一个抽象类,通常用于被继承,继承AsyncTask需要指定如下三个泛型参数:

Params: 启动任务时输入的参数的类型,也就是execute()方法中,传入的参数

Progress: 后台任务执行中返回进度值的类型,进度更新时用到

Result 后台执行任务完成后返回结果的类型,如果后台是从网络上获取一张图片,那么就返回Bitmap类型

构建AsyncTask子类的回调方法

(插入知识:什么是回调函数)你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件。(转自知乎作者:常溪玲)

doInBackground 必须重写,异步执行后台线程将要完成的任务

onPreExecute 执行后台耗时操作前被调用,通常用户完成一些初始化操作

onPostExecute 当doInBackground()完成后,系统会自动调用,并将doInBackground方法返回的值传给该方法。

onProgressUpdate 在doInBackground()方法中调用publishProgress()方法更新任务的执行进度后,就会触发该方法。可以很清楚的了解耗时操作的完成进度

函数执行顺序演示代码:

MyAsynTask.java

package com.example.app;

import android.os.AsyncTask;
import android.util.Log;

public class MyAsynTask extends AsyncTask {

	@Override
	protected Void doInBackground(Void... arg0) {
		// TODO Auto-generated method stub
		Log.d("sr", "doInBackground");
		publishProgress();
		return null;
		
	}

	@Override
	protected void onPostExecute(Void result) {
		// TODO Auto-generated method stub
		super.onPostExecute(result);
		Log.d("sr", "onPostExecute");
	}

	@Override
	protected void onPreExecute() {
		// TODO Auto-generated method stub
		super.onPreExecute();
		Log.d("sr", "onPreExecute");
	}

	@Override
	protected void onProgressUpdate(Void... values) {
		// TODO Auto-generated method stub
		super.onProgressUpdate(values);
		Log.d("sr", "onProgressUpdate");
	}
	
	
}

MainActivity.java

package com.example.app;

import android.os.Bundle;
import android.app.Activity;
import android.app.TaskStackBuilder;
import android.view.Menu;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		MyAsynTask task = new MyAsynTask();
		task.execute();
	}
	
}


输出结果:

\


下面是实例演示(加载一张网络图片):

异步线程:下载图像

UI线程:设置图像

还是在原来的工程中:

新建ImageTest.java类,继承Activity,创建OnCreate()方法。新建布局文件image.xml,里面有一个imageView显示图片 和一个进度条


image.xml



    
    
    
    
    




ImageTest.java

package com.example.app;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.ProgressBar;

public class ImageTest extends Activity {
	
	private ImageView mImageView;
	private ProgressBar mProgressBar;
	private static String URL = "http://image.zhaiba.com/2015/7/1/201507011732462088603781.jpg";//网路图片地址
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.image);
		
		mImageView = (ImageView) findViewById(R.id.image);
		mProgressBar = (ProgressBar)findViewById(R.id.progressbar);
	}

}

接下来创建AsynTask异步处理

在ImageTest.java中创建内部类MyAsyncTask 继承AsyncTask

ImageTest.java

package com.example.app;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.ProgressBar;

public class ImageTest extends Activity {
	
	private ImageView mImageView;
	private ProgressBar mProgressBar;
	private static String URL = "http://image.zhaiba.com/2015/7/1/201507011732462088603781.jpg";//网路图片地址
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.image);
		
		mImageView = (ImageView) findViewById(R.id.image);
		mProgressBar = (ProgressBar)findViewById(R.id.progressbar);
		//设置传递进去的参数
		new MyAsyncTask().execute(URL);//可以传入一个,或多个参数
	}
	
	class MyAsyncTask extends AsyncTask
	//第一个参数传入URL,所以是String,第二个参数不需要返回加载的进度,所以设置为Void,第三个值为返回值类型,这里是图片,所以设置为Bitmap
	{
		
		@Override
		protected void onPreExecute() {
			// TODO Auto-generated method stub
			super.onPreExecute();
			//将隐藏的进度条显示出来,提示用户等待
			mProgressBar.setVisibility(View.VISIBLE);//显示进度条
			
		}
		
		@Override
		protected void onPostExecute(Bitmap result) {
			// TODO Auto-generated method stub
			super.onPostExecute(result);
			//操作UI 设置图像
			mProgressBar.setVisibility(View.GONE);
			mImageView.setImageBitmap(result);
		}

		@Override
		protected Bitmap doInBackground(String... params) {//参数为不定长的数组,这是从execute()方法中传入的参数
			// TODO Auto-generated method stub
			//获取传递进来的参数
			String url = params[0];//上面execute方法中传入的参数第一个参数为URL
			Bitmap bitmap = null;
			URLConnection connection;
			InputStream is;
			try {
				connection = new URL(url).openConnection();
				is = connection.getInputStream();//获取输入流
				BufferedInputStream bis = new BufferedInputStream(is);
				//通过decodeStream方法解析输入流
				bitmap = BitmapFactory.decodeStream(bis);//将输入流解析为图像
				is.close();
				bis.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			//将bitmap作为返回值返回后面调用的方法
			return bitmap;//返回图像
		}
		
	}

}
配置AndroidManifest增加网络权限,声明activity

..............
android:name=".ImageTest">


在主页上添加一个按钮,点击,进入ImageTest那个activity

Activity_main.xml




 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Loader详解,asynctaskloader详解
  • AsyncTask注意事项,面试技巧和注意事项
  • 再谈Android AsyncTask的优缺点,androidasynctask
  • Android 旋转屏幕--处理Activity与AsyncTask的最佳解决方案,androidasynctask
  • Android中AsyncTask分析--你所不注意的坑,androidasynctask
  • AsyncTask基础(笔记)
  • Android中AsyncTask基本用法与源码剖析(API 23)
  • android源码解析之(二)--)异步任务AsyncTask
  • AsyncTask源码探究,asynctask源码
  • android:异步任务asyncTask介绍及异步任务下载图片(带进度条)

相关文章

  • 2017-05-26服务器DELL R710配置安装centos经验之谈
  • 2017-05-26URL转换成二维码,url
  • 2017-05-26几个常用的adb命令,常用adb命令
  • 2017-05-26Android 配置文件(activity)元素
  • 2017-05-26我的android学习经历6,android学习经历6
  • 2017-05-26Android 博客园客户端 (五) 查看评论、搜索博主,android查看评论
  • 2017-05-26Android进阶--Acticivity的启动模式,acticvity启动模式
  • 2017-05-26Android7.0 Phone应用源码分析(三) phone拒接流程分析,android7.0拒接
  • 2017-05-26activity的横屏和竖屏设置,activity
  • 2017-05-26Intent(三)向下一个活动传递数据,intent传递

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • cordova开发自定义插件
    • Swift开发iOS应用(1)列表的实现
    • android 编程小技巧(持续中)
    • Android Studio之代码提示快捷键冲突设置,androidstudio
    • android http同步请求,android同步请求
    • 悬浮对话框的实现,悬浮对话框实现
    • 用Anko和Kotlin实现Android上的对话框和警告提示(KAD 24),ankokotlin
    • 手机影音2--软件架构分析,影音2--架构分析
    • 详解Android中的SQLite数据库存储
    • android Android性能优化之如何避免Overdraw,androidoverdraw

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有