zoukankan      html  css  js  c++  java
  • 一起学Android之AsyncTask

    概述

    在Android开发中,为了方便我们在后台线程中执行操作,然后将结果发送给主线程,从而在主线程中进行UI更新等操作,Anddroid开发框架提供了一个助手类AsyncTask,它对Thread和Handler进行了封装,方便我们使用。

    涉及知识点

    AsyncTask提供了四个回调方法,分别在不同的时期进行调用,具体如下:

    1. onPreExecute() 任务执行之前的准备操作
    2. doInBackground(Void... params) 任务执行体
    3. nProgressUpdate(Integer... values) 任务执行过程中状态更新
    4. onPostExecute(Void aVoid) 任务执行完毕操作

    AsyncTask使用步骤

    1. 定义AsyncTask的子类,并在子类中实现回调函数
    2. 声明子类对象,并调用execute()方法

    示例功能图

    如下图所示:

    示例源代码

    定义AsyncTask的子类,并在子类中实现回调函数,源码如下:

     1  /**
     2      * 自定义任务类
     3      * Params:表示任务接收参数类型
     4      * Progress:表示进度类型
     5      * Result:返回值类型
     6      * Void是关键字void的占位符类
     7      */
     8     class MyTask extends AsyncTask<Void,Integer,Void>{
     9 
    10         /**
    11          * 任务执行之前的准备工作
    12          */
    13         @Override
    14         protected void onPreExecute() {
    15             Log.i(TAG, "onPreExecute: =========准备=========");
    16         }
    17 
    18         /**
    19          * 任务执行
    20          * @param params
    21          * @return
    22          */
    23         @Override
    24         protected Void doInBackground(Void... params) {
    25             Log.i(TAG, "doInBackground: =========正在执行=========");
    26             for(int i=0;i<100;i++){
    27                 publishProgress(i);
    28                 try {
    29                     Thread.sleep(500);
    30                 } catch (InterruptedException e) {
    31                     e.printStackTrace();
    32                 }
    33             }
    34             return null;
    35         }
    36 
    37         /**
    38          * 任务执行状态更新
    39          * @param values
    40          */
    41         @Override
    42         protected void onProgressUpdate(Integer... values) {
    43             int percent=(values[0]+1);
    44             mTextView.setText(String.valueOf(percent));
    45             mProgressBar.setProgress(percent);
    46         }
    47 
    48         /**
    49          * 任务执行结束触发事件
    50          * @param aVoid
    51          */
    52         @Override
    53         protected void onPostExecute(Void aVoid) {
    54             Log.i(TAG, "onPostExecute: =========执行完毕=========");
    55             Toast.makeText(MainActivity.this,"任务执行完毕",Toast.LENGTH_SHORT).show();
    56         }
    57     }

    声明子类对象,并调用execute()方法,源码如下:

    1     /**
    2      * 点击事件
    3      * @param v
    4      */
    5     public  void bn_task_click(View v){
    6         //通过调用execute()方法,执行任务
    7         Log.i(TAG, "bn_task_click: =========开始=========");
    8         new MyTask().execute();
    9     }

    调用日志如下所示:

    1 07-21 14:00:30.499 18439-18439/com.hex.demotask I/DemoTask: bn_task_click: =========开始=========
    2 07-21 14:00:30.501 18439-18439/com.hex.demotask I/DemoTask: onPreExecute: =========准备=========
    3 07-21 14:00:30.502 18439-18675/com.hex.demotask I/DemoTask: doInBackground: =========正在执行=========
    4 07-21 14:01:20.674 18439-18439/com.hex.demotask I/DemoTask: onPostExecute: =========执行完毕=========

    备注

    一日一钱,千日千钱,绳锯木断,水滴石穿。

  • 相关阅读:
    用代理模式 保持用户关闭链接的习惯
    jdbc 链接池的优化
    jdbc 链接池
    xml 操作
    互联网时代常用网站资源整理汇总(一直在完善中)
    快速读懂机器学习(附送详细学习资源)
    快速读懂机器学习(附送详细学习资源)
    常见网络命令之traceroute命令一起其他常用命令
    常见网络命令之traceroute命令一起其他常用命令
    Java案例之士兵作战功能实现
  • 原文地址:https://www.cnblogs.com/hsiang/p/11221160.html
Copyright © 2011-2022 走看看