一、进行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();
}
}
}