您的位置:首页 > 产品设计 > UI/UE

用AsyncTask处理UI线程阻塞问题

2016-02-22 14:16 441 查看
如果有操作阻塞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. 一个任务实例只能执行一次,如果执行第二次将会抛出异常。

基本摘录自点击打开链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: