异步任务 AsyncTask

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了异步任务 AsyncTask相关的知识,希望对你有一定的参考价值。

注:转载注明出处

异步任务:用于解决线程之间的数据传递(UI线程不能完成耗时操作,由子线程完成)

AsyncTask异步任务执行流程:

1 继承AsyncTask类 

   参数:parmas   progress  result

class MyAsyncTask extends AsyncTask<String, Integer, Integer>{

    重写3个方法

  

A: protected void onPreExecute(){

           耗时操作之前的准备工作(主线程)

           super.onPreExecute();

    }

2 重写doInBackground()方法-->网络访问,下载数据-->后台线程(耗时操作)(子线程)    

B:protected Integer doInBackground(String...params){

         发布进度:

  C:   publishProgress(100); (主线程)

         return null;

    }

D: protected void onProgressUpdate(Integer...values){

        更新进度,操作UI(主线程)

          super.onProgressUpdate(values);

    }

3 重写onPostExecute()方法-->下载数据之后的操作,更新UI

E: protected void onPostExecute(Integer result){

      耗时操作结束后执行的方法

          super.onPostExecute(result);

    }

}

4 添加网络访问权限 清单文件中

<user-permission android:name="android.permission.INTENT"/>

1.单线程模型:
当一个APP启动后,由安卓系统,创建一个线程,用于展示UI以及和用户交互。成为主线程(也叫UI线程)

该线程要求:
A:不能够被阻塞,就是不能够耗时操作。
B:不能够超过5是。ANR(应用程序无响应)Application not Responsing

启动子线程,分担主线程的工作,比如完成耗时操作。也叫做工作线程WorkThread
A:不能够更新UI(android.view,android.widget)
android.view.ViewRootImpl$CalledFromWrongThreadException:
Only the original thread that created a view hierarchy can touch its views.

2 使用异步任务来解决主线程和子线程之间的数据传递问题。
A:子线程耗时操作,获取数据
B:将数据传给主线程, 跟新UI。

AsyncTask类:
抽象类:

step1:onPreExecute()-->耗时操作之前执行的方法,用于准备操作。

step2:doInBackground()-->耗时操作所在的方法,用于访问网络。

step3:publishProgress(数据)-->发布进度

return 数据

step4:onProgressUpdate()-->用于更新进度。

step5:onPostExcute(doInBackground返回的结果)-->耗时操作执行后,执行的方法,用于操作数据更新UI

onCancelled()-->成功取消异步任务后,执行的方法。onPostExcute()就不执行了。

总结:

转自: http://www.cnblogs.com/android100/p/Android-AsyncTask.html

一、解决新线程无法更新UI组建问题的方案 

为了解决新线程不能更新UI组建的问题,Andorid提供了如下几种解决方案: 

  • 使用Handler实现线程之间的通信。 

  • Activity.runOnUiThread(Runnable)。 

  • View.post(Runnable)。 

  • View.postDelayed(Runnable)。 

 

二、ANR(Application Not Responding)异常 

Android默认约定当UI线程阻塞超过20秒将会引发ANR(Application Not Responding)异常。但实际上,不要说20秒,即使是5秒甚至2秒,用户都会感到十分不爽。因此,没必要去记这个20秒的时间限度。总之,开发者必须牢记:不要在UI线程中执行一些耗时操作。 

 

三、AsyncTask抽象类 

AsyncTask<Params,Progress,Result>是一个抽象类,通常用于被继承,继承AsyncTask需要指定如下三个泛型参数: 

  • Params:启动任务执行的输入参数的类型。 

  • Progress:后台任务完成进度值的类型。 

  • Result:后台执行任务完成后返回结果的类型。 

 

四、AsyncTask的特点 

  • 更轻量级一些,适用于简单的异步处理,不需要借助线程和Handler即可。 

 

五、使用AsyncTask的步骤 

 1.创建AsyncTask的子类,并为三个泛型参数指定类型。如果某个泛型参数不需要指定类型,可将它指定为void。 

  2.根据需要,实现AsyncTask的如下方法: 

       doInBackground(Params …):后台线程将要完成的任务,可以调用publishProgress(Progress... values)方法更新任务执行进度。 

       onProgressUpdate(Progress... values):在doInBackground()方法中调用publishProgress()方法更新任务的执行进度后,就会触发该方法。 

       onPreExecute():执行后台耗时操作前被调用,通常用户完成一些初始化操作,比如在界面上显示进度条。 

       onPostExecute(Result result):当doInBackground()完成后,系统会自动调用onPostExecute()方法,并将doInBackground方法返回的值传给该方法。 

  3.调用AsyncTask子类的实例的execute(Params... params)开始执行耗时任务。  

 

六、使用AsyncTask时必须遵守的规则 

  • 必须在UI线程中创建AsyncTask的实例。 

  • 必须在UI线程中调用AsyncTask的execute()方法。 

  • AsyncTask的onPreExecute()、onPostExecute(Result result)、doInBackground(Params... params)、onProgressUpdate(Progress... values)方法,不应该由程序员代码调用,而是由Android系统负责调用。 

  • 每个AsyncTask只能被执行一次,多次调用将会引发异常。

 

以上是关于异步任务 AsyncTask的主要内容,如果未能解决你的问题,请参考以下文章

异步任务-AsyncTask

异步任务 AsyncTask

安卓 AsyncTask 异步任务

Android AsyncTask异步任务的使用

异步任务-AsyncTask

异步任务-AsyncTask