zoukankan      html  css  js  c++  java
  • 使用AsyncTask类实现简单的异步处理操作

    AsyncTask:

    1.这是一种相比Handler更轻量级的处理异步任务的工具类

    2.它和Handler类一样,都是为了不影响主线程(UI)而使用的((注:UI的更新只能在主线程中完成)

    3.这个工具类提供了三个泛型的参数:

    params:启动或执行任务的输入参数,例如:HTTP请求的URL

    Progress:后台任务执行的百分比

    Result:后台执行任务最终返回的结果,比如String

    使用AsyncTask最少要重写这两个方法:

    1.doInBackground(params··)

      此方法在后台执行,比较耗时的操作都可以放在这里执行;

      这里不能直接操作UI(主线程),此方法在后台线程执行;完成任务的主要工作,通常需要很长世间;

      在此执行过程中可以调用publishProgress()来更新工作进度。

    2.onPostExecute(Result)

      相当于Handler处理UI的方式;

      可以使用在doInBackground得到的结果处理和操作UI;

      此方法在主线程中执行,任务执行的结果作为参数的返回。

    如果有必要还可以重写一下三个方法:

    onProgressUpdate();

      这里可以使用进度条来显示任务执行的进度情况,用来增加用户体验。(此方法在主线程中执行)

    onPreExecute();

      这里是用户调用Execute的接口,当任务执行之前开始调用此方法;

      可以在这里显示进度对话框

    onCancelled();

      此方法是用户调用取消的时候,自动调用的方法

    使用AsyncTask类应当注意的地方:

    1.此类的实例必须在主线程(UI交互)

    2.execute方法必须在UIthread中调用;

    3.不能手动调用自己重写的onPreExecute()等方法

    4.该任务只能执行一次,多次调用会出现异常

    一般情况下AsuncTask实例的运行过程:

    1.AsyncTask.execute(URL)>>>onPreExecute()>>>doInBackground(String... params)>>>onPostExecute(String s)>>>ShowInTextView!

    文字解释:使用execute()方法传入一个URL,onPreEXEcute()在执行doInBackground(String···params)之前先行加载,doInBackground(String···params)方法接收到的URL以数据方式存放在params中,所以可以使用一下步骤来实现读取URL数据,并从网络上获取数据的步骤,

    具体的代码:

      URL Url = new URL(params[0]);
       URLConnection connection = Url.openConnection();
       InputStream inputStream = connection.getInputStream();
       InputStreamReader ISR = new InputStreamReader(inputStream);
       BufferedReader bufferedReader = new BufferedReader(ISR);
       String line;
       StringBuilder builder = new StringBuilder();
       while ((line = bufferedReader.readLine())!=null){
         builder.append(line);
          }
       bufferedReader.close();
       inputStream.close();
       return builder.toString();
    //这里返回的String数据内容,会被onPostExecute(String s)接收,其中的内容就保存在S中
    //可用重写其方法,来将从网页获得的数据进行处理,比如说在一个TextView中显示
    @Override
    protected void onPostExecute(String s) {
    tvShow.setText(s);
    super.onPostExecute(s);
    }
    //若是不在这个方法里添加将数据内容发布的代码,就会执行系统中的原始代码,
    //但是在源码中,onPostExecute(String s)是一个抽象的方法,还未实现,所以若不重写
    //onPostExecute(String s)将不执行任何操作
    //并且经过查看源代码,这些重写的方法在源代码中都是抽象状态,没有任何的执行内容!

    2.onProgressUpdate(Void... values)可以在任务运行中调用,用来发布任务进度,提升用户体验

      

  • 相关阅读:
    Codeforces 631D Messenger KMP
    Google Codejam 2016 Round1A Problem C BFFs 简单图论
    ACM常用数论知识 总结
    C++ 虚函数表
    HDU 5661 Claris and XOR 贪心
    2013亚洲区域赛长沙站 ZOJ 3732 Graph Reconstruction
    [C++] upper_bound和lower_bound
    2015合肥网络赛 HDU 5489 Removed Interval LIS+线段树(树状数组)
    hdu 3532 Max Angle(atan2的使用)
    poj 1106 Transmitters (计算几何,叉积||极角排序)
  • 原文地址:https://www.cnblogs.com/thinfog/p/5648312.html
Copyright © 2011-2022 走看看