异步任务——AsyncTask

为何不能在其他线程中更新UI:保持UI也就是主线程的稳定性,准确性,避免多个线程同时操作UI产生的混乱。

为何要使用子线程:

Android是单线程模型,但又是多线程操作系统,耗时操作(网络操作,读取文件)如果全部在主线程中执行,就会造成后面任务的阻塞,系统会自动检测阻塞,当阻塞时间过长时,android就会抛出ANR,启动子线程,既可以保证Android的单线程模型,又可以防止ANR。异步处理方式:线程,线程池,AsyncTask


1. 用处:
将耗时操作放在非主线程中执行,既保证了Android单线程模型,也保证了程序的响应(不出现ANR)
AsyncTask在子线程中更新UI,封装、简化异步操作
2. AsyncTask<Params, Progress, Result>
是一个抽象类,通常用于被继承,继承AsyncTask需要指定如下三个泛型参数:
Params:启动任务时输入参数的类型
Progress:后台任务执行中返回进度值的类型
Result:后台执行任务完成后返回结果的类型
注意:参数不是一定要使用, private class MyTask extends AsyncTask<Void, Void, Void> { ... }
3. 在继承AsyncTask的子类中需要重写的回调方法
(如图)
onPreExecute()->doInBackground(Params...)->调用publishProgress(Progress...)->onProgressUpdate(Progress...)->doInBackground(Params...)执行结束->onPostExecute(Result)


doInBackground方法传入的是一个可变长数组,在execute方法中可以传递不止一个参数,存入params数组中
String url = params[0];//本例中只传入一个地址
Bitmap bitmap = null;
URLConnection connection;//定义网络连接对象
InputStream is;//用于获取数据的输入流
connection = new URL(url).openConnection();//获取网络连接对象,需要被try_catch
is = connection.getInputStream();//获取输入流
BufferedInputStream bis = new BufferedInputStream(is);
bitmap = BitmapFactory.decodeStream(bis);//将输入流解析成bitmap
is.close();//关闭输入流
bis.close();

ruturn bitmap;//将bitmap作为返回值返回给后面调用的方法



与UI线程通信
在onPreExecute()方法中
mProgressBar.setVisibility(View.VISIBLE);//显示进度条

在onPostExectute(Bitmap bitmap)方法中,参数是doInBackground()方法返回的参数
mProgressBar.setVisibility(View.GONE);//将进度条隐藏
mImageView.setImageBitmap(bitmap);//将图片设置为解析出来的网络图片

然后在onCreate方法中
new MyAsyncTask().execute(URL);//开启AsyncTask的异步线程操作,设置传递进去的参数


使用AsyncTask创建线程执行任务的时候,我们需要使得创建的线程的生命周期和我们Activity的生命周期一致。
即,当我们的Activity不可见的时候,我们需要及时“取消”我们AsyncTask中正在执行还没有执行完的任务,这样,等下次Activity出现的时候,我们才能给用户开始执行新任务的体验。否则,我们后台需要执行完上次的任务才能执行新的任务,这样会给我们用户一个“长时间等待无响应”的感觉。
通过调用mAsyncTask.cancel()方法可以取消AsyncTask的执行,但是注意这只是发送了一个cancel的请求,将对应的AsyncTask标记为cancel状态,并没有将其停止掉。
需要在doInBackground()方法中持续判断这个标记位

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值