为了避免UI线程失去响应的问题,Android建议将耗时操作放在新线程中完成,但新线程也可能需要动态更新UI组件:比如需要从网上获取一个网页,然后在TextView中将其源代码显示出来,此时就应该将连接的网络、获取网络数据的操作放在新线程中完成。问题是:获取网络数据之后,新线程不允许直接更新UI组件。
为了解决新线程不能更新UI组件的问题,Android提供了下面几种解决方案:
1. 使用Handler实现线程间通信
2. Activity.runOnUiThread(Runnable)
3. View.post(Runnable)
4. View.postDelayed(Runnable, long)
后3种方式可能导致编程略显繁琐,而异步任务(AsyncTask)则可以进一步简化这种操作
Handler与AsyncTask比较:AsyncTask更轻量级一些,适用于简单的异步处理,不需要借助线程和Handler即可实现
AsyncTask<Params, Progress, Result>是抽象类,用于被继承,它定义的三种泛型类型
Params: 启动任务执行的输入参数的类型
Progress: 后台任务完成的进度值的类型
Result: 后台执行任务完成后返回结果的类型
使用AsyncTask的步骤:
1. 创建AsyncTask子类,并为三个泛型参数指定类型。如果某个泛型参数不需要指定类型,设为void即可
2. 根据需要,实现AsyncTask的如下方法:
doInBackground(Params...): 重写该方法就是后台线程将要完成的任务。该方法可以调用publicProgress(Progress... values)方法更新任务的执行进度
onProgressUpdate(Progress... values): 在doInBackground()方法中调用publicProgress()方法更新任务的执行进度后,将会触发该方法
onPreExecute(): 该方法将在执行后台耗时操作前被调用。此方法通常用于完成一些初始化的准备工作,比如在界面上显示进度条等
onPostExecute(Result result): 当doInBackground()完成后,系统会自动调用onPostExecute()方法,并将doInBackground()方法的返回值传给该方法
3. 调用AsyncTask子类的实例的execute(Params... params)开始执行耗时任务
使用AsyncTask时必须遵守如下规则:
1.必须在UI线程中创建AsyncTask实例
2.必须在UI线程中调用AsyncTask的execute()方法
3.AsyncTask的onPreExecute()、onPostExecute(Result result)、doInBackground(Params... params)、onPregressUpdate(Progress... values)方法,不应该由程序员代码调用,而是由Android系统负责调用
4.每个AsyncTask只能被执行一次,多次调用将会引发异常
Android中,为避免UI线程阻塞,通常将耗时操作放在新线程。AsyncTask提供了一种简化线程间通信和更新UI的方式。它比Handler更轻量级,适合简单异步处理。AsyncTask包含三个泛型参数,用于输入、进度和结果。通过执行doInBackground、onPreExecute、onProgressUpdate和onPostExecute方法,可以在后台线程执行任务并更新UI。使用时必须在UI线程创建并执行AsyncTask,且每个实例只能执行一次。
181

被折叠的 条评论
为什么被折叠?



