异步任务(AsyncTask)

简介


Android中默认约定当UI线程阻塞超过20秒将会引发ANR(Application Not Responding)异常。但是实际上,5秒内就十分影响用户体验了。所以才有了异步任务(AsyncTask)的出现。

  • 为了避免UI失去响应的问题,Android建议将耗时的任务放在新的线程中完成,包括从网络获取图片、获取数据等等。

更新UI


  • 使用Handler来实现线程之间的通讯
  • View.post(Runnable)
  • View.postDelayed(Runnable ,long)
  • Activity.runOnUiThread(Runnable)

AsyncTask


AsyncTask参数

Params,Progress,Result

  • Params:第一个参数是启动任务传进来的参数;
  • Progress:第二个参数是用来显示进度条的参数;
  • Result:第三个参数是后台执行后返回的参数的类型。

几个方法

  • onPreExecute(): 在UI线程里面调用,它在这个task执行后会立即调用。我们在这个方法里面通常是用于建立一个任务,比如显示一个等待对话框来通知用户。
  • doInBackground(Params…):这个方法从名字就可以看出,它是运行在后台线程的,在这个方法里面,去做耗时的事情,比如下载访问网络,操作文件等。这这个方法里面,我们可以调用publishProgress(Progress…)来调用当前任务的进度,调用了这个方法后,对应的onProgressUpdate(Progress…)方法会被调用,这个方法是运行在UI线程的。
  • onProgressUpdate(Progress…):运行在UI线程,在调用publishProgress()方法之后。这个方法用来在UI上显示任何形式的进度,比如你可以显示一个等待对话框,也可以显示一个文本形式的log,还可以显示toast对话框。
  • onPostExecute(Result):当task结束后调用,它运行在UI线程。
  • 取消一个task,我们可以在任何时候调用cancel(Boolean)来取消一个任务,当调用了cancel()方法后,onCancelled(Object)方法就会被调用,onPostExecute(Object)方法不会被调用,在doInBackground(Object[])方法中,我们可以用isCancelled()方法来检查任务是否取消。
  • 几点规则:
    • AsyncTask实例必须在UI线程中创建,execute(Params…)方法必须在UI线程中调用。不用手动调用onPreExecute(), onPostExecute(),doInBackground(), onProgressUpdate()方法。一个任务只能被执行一次。

参考:Android 关于OOM的解决方案

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值