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: =========执行完毕=========

    备注

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

  • 相关阅读:
    Python抓取网页动态数据——selenium webdriver的使用
    mac上vim插件YouCompleteMe的安装
    shell命令的搜索顺序(hash -r, hash的作用)
    mac gcc framework include
    一个debug了4个多小时的bug, 操作系统真象还原: 试图运行起第6章的print相关函数却没有预期效果
    python中bytes类型与str类型的区别以及python中str类型是怎么存储的
    一行不解的awk代码
    OKR案例——不同类型的OKR实例
    PostgreSQL与MySQL优势比较
    [Win7 x64]Eclipse Indigo 3.7 中文字体偏小解决方案: Consolas 微软雅黑混合字体!
  • 原文地址:https://www.cnblogs.com/hsiang/p/11221160.html
Copyright © 2011-2022 走看看