zoukankan      html  css  js  c++  java
  • Android AsyncTask介绍*

    AsyncTask和Handler对比

    1 ) AsyncTask实现的原理,和适用的优缺点

    AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程.

    使用的优点:

    l  简单,快捷

    l  过程可控

           

    使用的缺点:

    l  在使用多个异步操作和并需要进行Ui变更时,就变得复杂起来.

    2 )Handler异步实现的原理和适用的优缺点

    在Handler 异步实现时,涉及到 Handler, Looper, Message,Thread四个对象,实现异步的流程是主线程启动Thread(子线程)àthread(子线程)运行并生成Message-àLooper获取Message并传递给HandleràHandler逐个获取Looper中的Message,并进行UI变更。

    使用的优点:

    l  结构清晰,功能定义明确

    l  对于多个后台任务时,简单,清晰

       

    使用的缺点:

    l  在单个后台异步处理时,显得代码过多,结构过于复杂(相对性)

     
    AsyncTask介绍
    Android的AsyncTask比Handler更轻量级一些,适用于简单的异步处理。
    首先明确Android之所以有Handler和AsyncTask,都是为了不阻塞主线程(UI线程),且UI的更新只能在主线程中完成,因此异步处理是不可避免的。
     

    Android为了降低这个开发难度,提供了AsyncTask。AsyncTask就是一个封装过的后台任务类,顾名思义就是异步任务。

    AsyncTask直接继承于Object类,位置为android.os.AsyncTask。要使用AsyncTask工作我们要提供三个泛型参数,并重载几个方法(至少重载一个)。

    AsyncTask定义了三种泛型类型 Params,Progress和Result。

    • Params 启动任务执行的输入参数,比如HTTP请求的URL。
    • Progress 后台任务执行的百分比。
    • Result 后台执行任务最终返回的结果,比如String。

    使用过AsyncTask 的同学都知道一个异步加载数据最少要重写以下这两个方法:

    • 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只能被执行一次,否则多次调用时将会出现异常;
       public class MyAsyncTask extends AsyncTask<String, Integer, String>{ 
                  /** 
                   * 异步任务:AsyncTask<Params, Progress, Result> 
                   * 1.Params:UI线程传过来的参数。 
                   * 2.Progress:发布进度的类型。 
                   * 3.Result:返回结果的类型。耗时操作doInBackground的返回结果传给执行之后的参数类型。 
                   * 
                   * 执行流程: 
                   * 1.onPreExecute() 
                   * 2.doInBackground()-->onProgressUpdate() 
                   * 3.onPostExecute() 
                   */
                  @Override                      
                  protected void onProgressUpdate(Integer... values)//执行操作中,发布进度后 
                  { 
                      progressBar.setProgress(values[0]);//每次更新进度条 
                      String str = Integer.toString(values[0]);
                      textView.setText(str); 
                  } 
                  @Override
                  protected void onPreExecute()//执行耗时操作之前处理UI线程事件 
                  { 
                      progressBar.setVisibility(View.VISIBLE);//点击之后,下载执行之前,设置进度条可见 
                  } 
                      
                  @Override
                  protected String doInBackground(String...  params)//执行耗时操作 
                  { 
                      //在此方法执行耗时操作,耗时操作中发布进度,更新进度条 
                      //String result = download(); 
                      for (int i = 0; i < 100; i++) 
                      { 
                          try
                          { 
                              Thread.sleep(100); 
                              publishProgress(i);//进度条每次更新10%,执行中创建新线程处理onProgressUpdate()
              
                          } 
                          catch (InterruptedException e) 
                          { 
                              e.printStackTrace(); 
                          } 
                              
                      } 
                      return "下载完成!"; 
                  } 
                      
                  @Override
                  protected void onPostExecute(String result)//执行耗时操作之后处理UI线程事件 
                  { 
                      //在此方法执行main线程操作 
                      progressBar.setVisibility(View.GONE);//下载完成后,隐藏进度条 
                      textView.setText(result); 
                  } 
                      
              } 
  • 相关阅读:
    MVP模式与MVVM模式
    webpack的配置处理
    leetcode 287 Find the Duplicate Number
    leetcode 152 Maximum Product Subarray
    leetcode 76 Minimum Window Substring
    感知器算法初探
    leetcode 179 Largest Number
    leetcode 33 Search in Rotated Sorted Array
    leetcode 334 Increasing Triplet Subsequence
    朴素贝叶斯分类器初探
  • 原文地址:https://www.cnblogs.com/chenxibobo/p/6136757.html
Copyright © 2011-2022 走看看