Android_基础知识_01_异步任务AsyncTask
2014-12-05 21:25
323 查看
一、进行Android应用开发时必须遵循单线程模型,这里有两个法则是我们必须遵守的
1.不可以堵塞UI线程(也就是主线程(main),因为你处理UI(用户界面)时,必须在主线程中处理,所以也叫做UI线程).
2.不能再非UI线程进行UI操作
二、在开发时,我们经常需要进行一些耗时的操作,像图片.JSON字符串的下载等,这些都是耗时操作,在UI线程中进行时,很容易堵塞主线程.所以就有了异步任务AsyncTask来解决这个问题,当然这个并不是唯一的方法,其他的如Handler机制
也可以处理,这里着重介绍异步任务.
三、废话不多说,下面我用代码来显示AsyncTask是如何进行的
public class MainActivity extends Activity {
这里url地址太长没写,随便到网上找一个图片地址就好.
private String url="";
private Button btn;
private ImageView iv;
private ProgressDialog mDialog;//进度条对话框
//在onCreate()中找到我们所需要的控件
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn=(Button) findViewById(R.id.btn);
iv=(ImageView) findViewById(R.id.iv);
//在按钮点击事件中进行图片的下载
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//执行异步任务,开始下载
//谨记:一定要在主线程中开启一个异步任务,不然异步任务是不会执行的
new MyTask().execute(url);
}
});
}
//这里值的注意的是异步任务的三个参数:
//1.String Param 任务执行器需要的数据类型,也就是开启任务时的url
//2.Void Progress 后台计算中使用的进度单位数据类型,一般都是进度条,没有进度条的时候,设为Void,注意此处V是//大写的
//3.Bitmap Result 后台计算返回结果的数据类型,就是doInBackground()的返回值类型,这个返回值会传到//onPostExecute(Bitmap result)这个方法中作为参数,也就是result.
class MyTask extends AsyncTask<String, Void, Bitmap>{
@Override
protected void onPreExecute() {
super.onPreExecute();
//创建进度条对话框对象
mDialog=new ProgressDialog(MainActivity.this);
//设置对话框的标题
mDialog.setTitle("下载龙泽萝拉");
//设置对话框的内容
mDialog.setMessage("正在拼命下载中....");
//将对话框展示出来
mDialog.show();
}
//这个方法为工作线程,不可以进行主线程的操作
//这里是进行下载
@Override
protected Bitmap doInBackground(String... params) {
Bitmap bitmap=null;
try {
//HttpUtil.loadImgFromNet(params[0], "get"); 是自定义的下载类.
byte[] data = HttpUtil.loadImgFromNet(params[0], "get");
//将一个字节数组转换成Bitmap类型
bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
} catch (Exception e) {
e.printStackTrace();
}
return bitmap;
}
//这个方法是主线程,进行工作线程与主线程的通信,可以进行主线程的操作
@Override
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
//给ImageView设置图片
iv.setImageBitmap(result);
//让对话框消失
mDialog.dismiss();
}
}
}
这是第一次写博客,希望大家多多支持,以后我会经常写的..
1.不可以堵塞UI线程(也就是主线程(main),因为你处理UI(用户界面)时,必须在主线程中处理,所以也叫做UI线程).
2.不能再非UI线程进行UI操作
二、在开发时,我们经常需要进行一些耗时的操作,像图片.JSON字符串的下载等,这些都是耗时操作,在UI线程中进行时,很容易堵塞主线程.所以就有了异步任务AsyncTask来解决这个问题,当然这个并不是唯一的方法,其他的如Handler机制
也可以处理,这里着重介绍异步任务.
三、废话不多说,下面我用代码来显示AsyncTask是如何进行的
public class MainActivity extends Activity {
这里url地址太长没写,随便到网上找一个图片地址就好.
private String url="";
private Button btn;
private ImageView iv;
private ProgressDialog mDialog;//进度条对话框
//在onCreate()中找到我们所需要的控件
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn=(Button) findViewById(R.id.btn);
iv=(ImageView) findViewById(R.id.iv);
//在按钮点击事件中进行图片的下载
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//执行异步任务,开始下载
//谨记:一定要在主线程中开启一个异步任务,不然异步任务是不会执行的
new MyTask().execute(url);
}
});
}
//这里值的注意的是异步任务的三个参数:
//1.String Param 任务执行器需要的数据类型,也就是开启任务时的url
//2.Void Progress 后台计算中使用的进度单位数据类型,一般都是进度条,没有进度条的时候,设为Void,注意此处V是//大写的
//3.Bitmap Result 后台计算返回结果的数据类型,就是doInBackground()的返回值类型,这个返回值会传到//onPostExecute(Bitmap result)这个方法中作为参数,也就是result.
class MyTask extends AsyncTask<String, Void, Bitmap>{
@Override
protected void onPreExecute() {
super.onPreExecute();
//创建进度条对话框对象
mDialog=new ProgressDialog(MainActivity.this);
//设置对话框的标题
mDialog.setTitle("下载龙泽萝拉");
//设置对话框的内容
mDialog.setMessage("正在拼命下载中....");
//将对话框展示出来
mDialog.show();
}
//这个方法为工作线程,不可以进行主线程的操作
//这里是进行下载
@Override
protected Bitmap doInBackground(String... params) {
Bitmap bitmap=null;
try {
//HttpUtil.loadImgFromNet(params[0], "get"); 是自定义的下载类.
byte[] data = HttpUtil.loadImgFromNet(params[0], "get");
//将一个字节数组转换成Bitmap类型
bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
} catch (Exception e) {
e.printStackTrace();
}
return bitmap;
}
//这个方法是主线程,进行工作线程与主线程的通信,可以进行主线程的操作
@Override
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
//给ImageView设置图片
iv.setImageBitmap(result);
//让对话框消失
mDialog.dismiss();
}
}
}
这是第一次写博客,希望大家多多支持,以后我会经常写的..
相关文章推荐
- Java基础知识强化之网络编程笔记15:Android网络通信之 Android异步任务处理(AsyncTask使用)
- Android基础学习之AsyncTask(异步任务处理类)二
- Android源码基础解析之异步任务AsyncTask
- Android基础学习之AsyncTask(异步任务处理类)一
- Android学习笔记:Android异步任务之AsyncTask基础
- 【Android基础笔记07】异步任务AsyncTask
- 15-多线程编程(01-AsyncTask异步任务介绍一)
- android基础知识03——事件处理01:主要事件及其处理方式
- Android开发 AsyncTask异步任务类
- Android异步任务AsyncTask实现方式
- Android:异步任务AsyncTask、execute、publishProgress、onProgressUpdate
- Android开发 AsyncTask异步任务类
- Android 异步任务——AsyncTask (附Demo下载)
- [Android]异步任务AsyncTask使用解析
- Android开发--AsyncTask异步任务(二)
- android基础知识03——事件处理01:主要事件及其处理方式
- android基础知识01——Timer
- [Android]异步任务AsyncTask使用解析
- Android开发--AsyncTask异步任务(二)
- [Android]异步任务AsyncTask使用解析