初学android开发--day07

来源:互联网 发布:linux tomcat常用命令 编辑:程序博客网 时间:2024/05/17 02:47

AsyncTask的使用背景

Android的UI操作不是线程安全的:

1)主线程中不能执行耗时操作,否则BANG! ANR

2)Android不允许在子线程中操作主线程中的UI控件,否则BANG!

3)UI操作只能在UI线程执行

4)耗时操作要放在子线程中去执行,执行完了之后将结果返回给主线程去刷新UI控件

那么如何在其他线程中访问主线程呢?

1)Handler线程通信机制(以后再讲)

2)Activity.runOnUiThread(Runnable)

3)View.post(Runnable)或者View.postDelay(Runnable,long)

4)AsyncTask(异步任务)

为什么使用AsyncTask?

1、我们不需要自己创建子线程,AsyncTask内部已经封装好了一个线程池去执行耗时操作

2、不需要自己写相应的方法去更新UI界面,例如:根据下载进度更新UI界面中ProgressBar的进度

3、AsyncTask已经包含了所有子线程和UI线程需要处理的操作

AsyncTask异步任务

1)包含一系列的回调方法来完成在子线程中要完成的耗时操作,并将结果返回给主线程去刷新UI

2)码农只需继承AsyncTask,提供三个泛型参数,并实现这几个回调方法

3)调用execute(Params)方法来执行这个异步任务

如何使用AsyncTask

1、创建子类继承AsyncTask

2、复写AsyncTask的抽象方法,完成耗时操作并在主线程中刷新UI

3、调用AsyncTask.execute(String params)方法执行异步任务

AsyncTask的周期方法

onPreExecute

第一个被调用的方法

在UI线程中执行

做一些后台任务启动前的准备工作,比如show出一个progress

doInBackground

第二个被调用的方法

在子线程中执行,处理一些耗时操作,并将结果返回给onPostExecute

该方法由系统调用,不要人为的去调用

入参是第一个泛型参数

返回值对应第三个泛型参数

onProgressUpdate

第三个被调用的方法

需要在doInBackground中调用publishProgress方法,才会被调用

入参对应第二个泛型参数

onPostExecute

第四个被调用的方法

在UI线程中执行

入参就是doInBackground的返回值

下面写一个代码片段说明一下

</pre><pre name="code" class="java">/** * 继承AsyncTask是需要指定3个泛型 * 第一个泛型: 执行AsyncTask传入的参数类型execute(参数), 还是doInBackground得入参类型 * 第二个泛型: 想用户提示任务进度的使用的参数类型,可以使用Void说明不传任何类型 * 第三个泛型: doInBackground的返回值类型,onPostExecute的入参类型 * */class MyTask extends AsyncTask<String, Void, String>{/** * 当调用AsyncTask.execute方法只后此方法立即被调用 * 在主线程中执行,做一些准备工作 */@Overrideprotected void onPreExecute() {super.onPreExecute();long threadId = Thread.currentThread().getId();String threadName = Thread.currentThread().getName();android.util.Log.e("danny", "onPreExecute--threaId is " + threadId + " threadName is " + threadName);}/** * 在子线程中执行耗时操作 * 入参是第一个泛型类型 * 返回值类型是第三个泛型类型 */@Overrideprotected String doInBackground(String... params) {long threadId = Thread.currentThread().getId();String threadName = Thread.currentThread().getName();android.util.Log.e("danny", "doInBackground--threaId is " + threadId + " threadName is " + threadName);android.util.Log.e("danny", "param is " + params[0]);for(int i = 0; i < 10; i++){try {android.util.Log.e("danny", "当前任务执行到 " + i);Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}return "job finished";}/** * 当doInBackground执行完之后立即执行 * 在主线程中执行 * 入参是doInBackground的返回值 */@Overrideprotected void onPostExecute(String result) {super.onPostExecute(result);long threadId = Thread.currentThread().getId();String threadName = Thread.currentThread().getName();android.util.Log.e("danny", "onPostExecute--threaId is " + threadId + " threadName is " + threadName);text.setText(result);}



0 0
原创粉丝点击