iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android用HandlerThread模拟AsyncTask功能(ThreadTask)
  • 348
分享到

Android用HandlerThread模拟AsyncTask功能(ThreadTask)

handlerthreadasynctaskAndroid 2022-06-06 08:06:39 348人浏览 泡泡鱼
摘要

前言  AsyncTask是个好东西,能处理绝大多数应用线程和更新UI的任务,由于其内部使用了静态线程池,如果你有一堆异步任务(例如全局定时更新数据、同一个Activ

前言

 AsyncTask是个好东西,能处理绝大多数应用线程和更新UI的任务,由于其内部使用了静态线程池,如果你有一堆异步任务(例如全局定时更新数据、同一个Activity中多个AsyncTask同时执行)其中有不能马上执行完的情况(例如网络请求超时),那就糟了,其他任务都还等着呢,就会出现任务卡住的情况。此时就需要直接上Thread了,这里参考AsyncTask的api封装了一个ThreadTask,便于必要时代码替换,欢迎交流!

 正文实例代码:


import Android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
public abstract class ThreadTask<Params, Progress, Result> {
  private HandlerThread mHandlerThread;
  private TaskHandler mHandler;
  private TaskHandler mUiHandler;
  private Params[] mParams;
  public ThreadTask() {
    mHandlerThread = new HandlerThread("ThreadTask", android.os.Process.THREAD_PRioRITY_BACKGROUND);
    mHandlerThread.start();
    mHandler = new TaskHandler(mHandlerThread.getLooper());
    mUiHandler = new TaskHandler(Looper.getMainLooper());
  }
  protected abstract Result doInBackground(Params... params);
  protected void onPreExecute() {
  }
  protected void onProgressUpdate(Progress... values) {
  }
  protected final void publishProgress(Progress... values) {
    mUiHandler.obtainMessage(MESSAGE_PROGRESS, values).sendToTarget();
  }
  protected void onPostExecute(Result result) {
  }
  public final boolean isCancelled() {
    return mHandlerThread.isInterrupted();
  }
  public final void cancel(boolean mayInterruptIfRunning) {
    if (!mHandlerThread.isInterrupted()) {
      try {
        mHandlerThread.quit();
        mHandlerThread.interrupt();
      } catch (SecurityException e) {
        e.printStackTrace();
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
    onCancelled();
  }
  protected void onCancelled() {
  }
  public void execute(Params... params) {
    mParams = params;
    onPreExecute();
    mHandler.sendEmptyMessage(MESSAGE_INBACKGROUND);
  }
  private static final int MESSAGE_INBACKGROUND = 0;
  private static final int MESSAGE_POSTEXECUTE = 1;
  private static final int MESSAGE_PROGRESS = 2;
  private class TaskHandler extends Handler {
    public TaskHandler(Looper looper) {
      super(looper);
    }
    @SuppressWarnings("unchecked")
    @Override
    public void handleMessage(Message msg) {
      switch (msg.what) {
      case MESSAGE_INBACKGROUND:
        mUiHandler.obtainMessage(MESSAGE_POSTEXECUTE, doInBackground(mParams)).sendToTarget();
        break;
      case MESSAGE_POSTEXECUTE:
        onPostExecute((Result) msg.obj);
        mHandlerThread.quit();
        break;
      case MESSAGE_PROGRESS:
        onProgressUpdate((Progress[]) msg.obj);
        break;
      }
    }
  }
}

代码说明:

   由于onPreExecute和onPostExecute都在在主线程执行,又要保证执行的顺序,所以采用Handler来控制执行顺序,根据Loop的不同,Handler能切换在子线程中执行代码还是在主线程中执行代码。

结束:

除了不受线程池控制以外,还能被真正的cancel掉(AsyncTask是不能的,只是一个标记)。

以上就是Android  用HandlerThread模拟AsyncTask功能的代码实现,欢迎大家来交流。

您可能感兴趣的文章:实例分析Android中HandlerThread线程用法Android HandlerThread使用方法详解Android HandlerThread的使用及原理详解android使用handlerthread创建线程示例Android实例HandlerThread源码分析


--结束END--

本文标题: Android用HandlerThread模拟AsyncTask功能(ThreadTask)

本文链接: https://www.lsjlt.com/news/24564.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android实现模拟搜索功能
    本文实例为大家分享了Android实现模拟搜索功能的具体代码,供大家参考,具体内容如下 先看效果图,合适了再接着往下看: 我们看到的这个页面,是由两部分组成,顶部的自定义的搜索框,...
    99+
    2024-04-02
  • Android中使用ListView模拟微信好友功能
    效果图:分析:创建listView创建数据创建适配器  将数据放到呈现数据的容器里面。  将这个容器(带数据)连接适配器。    其实是直接在我们自己写的adapter的getView重载方法中返回连接的view。    View view...
    99+
    2023-05-30
    android listview 微信好友
  • Android 模拟地图定位功能的实现
    实现原理: 手机定位方式目前有4种: 基站定位WIFI定位GPS定位AGPS定位 本工程利用手机自带的"模拟位置"功能实现运行时修改LocationManager...
    99+
    2024-04-02
  • 使用Android爬虫怎么模拟一个登录功能
    这篇文章将为大家详细讲解有关使用Android爬虫怎么模拟一个登录功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。实例代码:package com.yasin;import&nb...
    99+
    2023-05-30
    android
  • Android中怎么利用AsyncTask实现下载文件动态更新进度条功能
    Android中怎么利用AsyncTask实现下载文件动态更新进度条功能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1. 泛型AysncTask<Params, Pro...
    99+
    2023-05-30
    android asynctask
  • C++模拟实现list功能
    目录list介绍构造函数无参构造函数有参构造函数模板区间构造函数拷贝构造函数赋值运算符重载析构函数迭代器迭代器构造函数迭代器关系运算符重载迭代器++ --运算符重载迭代器 * 运算符...
    99+
    2024-04-02
  • [Android Studio] Android Studio Virtual Device(AVD)虚拟机的功能试用
     🟧🟨🟩🟦🟪 Android Debug🟧🟨🟩🟦🟪 Topic  发布安卓学习...
    99+
    2023-09-12
    android studio android ide
  • android helper模块有哪些功能
    Android Helper模块通常包含以下功能: 系统信息:获取设备的基本信息,如设备型号、操作系统版本、屏幕分辨率等。 应用管...
    99+
    2024-02-29
    android
  • vue使用WebSocket模拟实现聊天功能
    效果展示 两个浏览器相互模拟 1.创建模拟node服务 在vue根目录下创建 server.js 文件模拟后端服务器 **在server终端目录下载 ** npm insta...
    99+
    2024-04-02
  • 原生js模拟购物车功能
    使用html配合原生js实现购物车功能,供大家参考,具体内容如下 * 实现购物车商品数量的加减,注意数量最少为1,数量输入仅能为数字* 实现购物车商品的移除* 可以在同一页面再设计几...
    99+
    2024-04-02
  • C#模拟实现QQ窗体功能
    目录案例简述预备知识导图功能结构知识点分析C#基础知识Windows系统知识控件和组件案例简述 通过C#使用类似QQ窗体的功能,当窗体放置到屏幕的边缘,可以将窗体隐藏,当鼠标再次放置...
    99+
    2022-12-26
    C#实现QQ窗体 C# QQ窗体 C# QQ
  • python scrapy实现模拟登录功能
    本篇内容介绍了“python scrapy实现模拟登录功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、requests模块。直接携带c...
    99+
    2023-06-20
  • 云服务器怎么使用模拟器功能
    使用云服务器可以使用模拟器来进行安装、配置和测试,以下是一些常见的方法:在浏览器中访问模拟器网站:https://iqcloud.com/yuncloud-server/使用浏览器扩展程序:在模拟器网站上搜索“云服务器”或“云服务器模拟器”...
    99+
    2023-10-25
    模拟器 功能 服务器
  • vue如何模拟加载更多功能
    这篇文章给大家分享的是有关vue如何模拟加载更多功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。使用vue制作加载更多功能,通过ajax获取的数据往data里面push经常不成...
    99+
    2024-04-02
  • java实现模拟USB接口的功能
    目录1 题目2 思路分析3 代码实现4 代码运行截图1 题目 模拟USB接口的功能我们在使用计算机的时候经常会用到USB接口,鼠标、键盘等都是带USB接口的设备,我们只需要将鼠标、键...
    99+
    2024-04-02
  • 云服务器怎么使用模拟器功能的
    使用云服务器可以使用模拟器来进行安装、配置和测试,以下是一些常见的方法: 安装模拟器:首先要安装一个模拟器软件。可以从网络上找到一个现成的模拟器软件,下载并安装完毕后,将其连接到您的服务器。 配置模拟器:一旦您的虚拟服务器已经配置完成,...
    99+
    2023-10-26
    模拟器 功能 服务器
  • jQuery如何模拟淘宝购物车功能
    这篇文章主要介绍jQuery如何模拟淘宝购物车功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!首先我们要实现的内容的需求有如下几点:1.在购物车页面中,当选中“全选”复选框时,所有...
    99+
    2024-04-02
  • java多线程模拟实现售票功能
    铁道部发布了一个售票任务,要求销售1000张票,要求有3个窗口来进行销售,请编写多线程程序来模拟这个效果。 1 线程类 测试方法: public static void main...
    99+
    2024-04-02
  • Vue模拟实现购物车结算功能
    本文实例为大家分享了Vue实现购物车结算功能的具体代码,供大家参考,具体内容如下 <!DOCTYPE html> <html lang="en"> <...
    99+
    2024-04-02
  • jQuery如何模拟爆炸倒计时功能
    这篇文章主要为大家展示了“jQuery如何模拟爆炸倒计时功能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“jQuery如何模拟爆炸倒计时功能”这篇文章吧。&nb...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作