您的位置:首页 > 移动开发 > Android开发

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();
}

}

}

这是第一次写博客,希望大家多多支持,以后我会经常写的..
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: