用AsyncTask处理UI线程阻塞问题

如果有操作阻塞UI线程软件可能出现界面无响应错误,所以耗时操作不要放在UI线程中实现。

常用的解决方式是把这类网络操作,加载大文件等等耗时操作通过AsyncTask在后台线程中处理。

如何使用AsyncTask?

通过集成AsyncTask抽象类写一个自己的myAsyncTask类

private class MyTask extends AsyncTask<String, Integer, String> 

三个泛型类型参数代表了“启动任务执行的参数”“后台任务和前台UI共享的参数”和“后台最后计算结果参数”,不一定要用,如果没有被用,可以用java.lang.Void类型代替。

使用时要重写的几个方法:

1.execute(Params... params),需要我们在代码中调用此方法触发执行异步任务。

2.onPreExecute(),在execute(Params... params)被调用后立即执行,般用来在执行后台任务前对UI做一些标记。

3.doInBackground(Params... params),在onPreExecute()成后立即执行,用于执行较为费时的操作,此方法将接收输入参数和返回计算结果。在执行过程中可以调用publishProgress(Progress... values)来更新进度信息。

4.onProgressUpdate(Progress... values),在调用publishProgress(Progress... values)时,此方法被执行,直接将进度信息更新到UI组件上。

5.onPostExecute(Result result),当后台操作结束时,此方法将会被调用,计算结果将做为参数传递到此方法中,直接将结果显示到UI组件上。

 

在使用的时候,有几点需要格外注意:

1. 异步任务的实例必须在UI线程中创建。

2. execute(Params... params)方法必须在UI线程中调用。

3. 不要手动调用onPreExecute(),doInBackground(Params... params),onProgressUpdate(Progress... values),onPostExecute(Result result)这几个方法。

4. 不能在 doInBackground(Params... params)中更改UI组件的信息。

5. 一个任务实例只能执行一次,如果执行第二次将会抛出异常。

 

基本摘录自点击打开链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值