消息机制我们已经用的足够熟练了,但是还是觉得美中不足的是就是子线程不能在
主线程UI更新,这样就带来了很多不方便,有没有可以解决这一麻烦的方法呢,有,这里介绍一个异步操作类
AsyncTask
AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程.
使用的优点:
简单,快捷
过程可控
使用的缺点:
在使用多个异步操作和并需要进行Ui变更时,难度加大
AsyncTask定义了三种泛型类型 Params,Progress和Result。
- Params 启动任务执行的输入参数,比如HTTP请求的URL。
- Progress 后台任务执行的百分比。
- Result 后台执行任务最终返回的结果,比如String。
- doInBackground(Params…) 后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress…)来更新任务的进度。
- onPostExecute(Result) 相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。 此方法在主线程执行,任务执行的结果作为此方法的参数返回
-
有必要的话你还得重写以下这三个方法,但不是必须的:
- onProgressUpdate(Progress…) 可以使用进度条增加用户体验度。 此方法在主线程执行,用于显示任务执行的进度。
- onPreExecute() 这里是最终用户调用Excute时的接口,当任务执行之前开始调用此方法,可以在这里显示进度对话框。
- onCancelled() 用户调用取消时,要做的操作
使用AsyncTask类,以下是几条必须遵守的准则:
- Task的实例必须在UI thread中创建;
- execute方法必须在UI thread中调用;
- 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法;
- 该task只能被执行一次,否则多次调用时将会出现异常;
现在我们使用进度条来实现子线程对主线程UI实时更新
主布局函数:
<ProgressBar android:id="@+id/bar" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/info" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="TextView" />
Activity
代码:
public class MainActivity extends Activity { private TextView info=null; private ProgressBar bar=null; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.info=(TextView)super.findViewById(R.id.info); this.bar=(ProgressBar)super.findViewById(R.id.bar); ChildUpdate child=new ChildUpdate(); child.execute(100);//休眠时间 } private class ChildUpdate extends AsyncTask<Integer,Integer,String>{ protected void onPostExecute(String result){ MainActivity.this.info.setText(result);//程序执行完毕 } protected void onProgressUpdate(Integer...progress){//每次程序更新之后的数据 MainActivity.this.info.setText("当前进度为:"+String.valueOf(progress[0])); } protected String doInBackground(Integer...params) { // TODO Auto-generated method stub for(int i=0;i<100;i++){ MainActivity.this.bar.setProgress(i); this.publishProgress(i);//及时更新 try { Thread.sleep(100);//每0.1秒增长 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return "完毕"; } } }
实现效果如下:
相关推荐
在Android开发中,异步操作是必不可少的一部分,它允许开发者在后台线程执行耗时任务,以避免阻塞主线程并提升用户体验。`AsyncTask`是Android SDK提供的一种轻量级的异步处理机制,主要用于简化短时间的后台操作。...
AsyncTask 是 Android 平台上一种轻量级的异步处理机制,主要用于在后台执行耗时操作,同时确保结果能够在主线程中安全地更新 UI。它简化了多线程编程,尤其是与用户界面交互的需求。 首先,AsyncTask 包含三个泛型...
总的来说,`AsyncTask`是Android中实现简单异步操作的有效工具,特别是对于轻量级的网络请求和计算任务。然而,对于更复杂的多线程需求,如大量的并发任务或复杂的任务协调,开发者可能需要考虑使用`IntentService`...
在实际使用中,可以使用AsyncTask来实现各种异步任务,例如网络请求、数据库操作、图片处理等。例如,在一个Activity中,点击按钮时,可以使用AsyncTask来执行耗时的操作,例如下载文件或请求网络数据。 以下是一个...
AsyncTask是Android提供的轻量级异步任务框架,用于在后台执行耗时操作,然后在UI线程更新结果。AsyncTask包含三个泛型参数:Params, Progress, Result,分别代表输入参数类型、进度类型和返回结果类型。其执行流程...
以从网上下载图片为例,讲解Android自带的异步操作类----AsyncTask类的用法 public class DownloadPicture extends AsyncTask, Integer, Bitmap> 其中包含三个异步操作类可供测试
在使用`AsyncTask`处理网页下载时,首先创建一个继承自`AsyncTask`的类,然后重写上述方法。下面是一个基本示例: ```java public class DownloadWebPageTask extends AsyncTask, Void, String> { @Override ...
在Android应用开发中,异步任务(AsyncTask)是一个强大的工具,用于在后台线程执行耗时操作,然后在UI线程更新结果,避免了主线程(UI线程)因执行长时间运算而阻塞的问题。Android SDK提供的AsyncTask类使得开发者...
`AsyncTask`是Android SDK提供的一种轻量级的异步任务处理类,它简化了在后台线程中执行任务并在UI线程中更新结果的过程。`AsyncTask`包含三个泛型参数:`Params`、`Progress`和`Result`,分别代表输入参数类型、...
3. **解析**:在此示例中,我们首先定义了一个名为`LoadDataTask`的`AsyncTask`子类,该类的三个泛型参数分别是`Void`、`Void`和`List<String>`。`Void`表示没有输入参数和进度更新,`List<String>`则表示后台任务的...
总的来说,`AsyncTask`是Android平台上的一个强大工具,能够帮助开发者轻松地实现异步操作,避免UI线程阻塞,提高应用的响应速度和用户体验。然而,对于大量或者复杂的异步任务,可能需要考虑使用更高级的解决方案,...
在Android开发中,异步操作是必不可少的一部分,用于在后台执行耗时操作,不阻塞用户界面。`AsyncTask`是Android提供的一种轻量级的异步处理机制,专为短时间、简单背景任务设计。本文将深入探讨`AsyncTask`的工作...
params)`:这是异步操作的核心部分,它在后台线程中执行,可以进行耗时操作。传入的`Params`参数可以在方法内部使用,而返回的`Result`将传递给`onPostExecute()`。 3. `onProgressUpdate(Progress... values)`:当...
在Android应用开发中,异步任务(AsyncTask)是一个非常重要的组件,主要用于处理那些需要在后台线程执行但又需要与UI交互的操作。AsyncTask使开发者能够轻松地在后台线程执行耗时操作,然后在主线程更新UI,避免了...
AsyncTask是Android中的一个抽象类,用于在后台线程执行任务,同时允许在UI线程更新进度和结果。它的设计目的是简化与UI交互的多线程编程,包含三个泛型参数:Params, Progress, Result,分别代表输入参数类型、进度...
Android API 11以上,AsyncTask的执行是在一个序列化的线程池中,而在早期版本,每个任务都会创建一个新的线程。因此,在不同版本的设备上,需要考虑执行效率和资源消耗。 8. **限制与最佳实践** 避免在循环或...
AsyncTask是Android SDK提供的一种轻量级的异步处理类,适用于进行简单的后台任务处理,例如网络请求、数据库操作等。本文件主要探讨了如何使用AsyncTask来实现异步加载,并提供了两个版本的示例,特别是第二个版本...
1. 创建一个继承自AsyncTask的类,并定义`doInBackground()`方法。 2. 在`doInBackground()`中执行耗时操作。 3. 在`onPreExecute()`中可以做一些准备工作,如显示进度条。 4. `doInBackground()`执行完成后,调用`...
在Android开发中,异步任务(AsyncTask)是一种常见的用于执行后台操作的工具,它能够帮助开发者在主线程中更新UI,避免了由于长时间运行任务而导致的ANR(Application Not Responding)错误。本篇文章将深入探讨...