返回顶部
首页 > 资讯 > 移动开发 >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://lsjlt.com/news/24564.html(转载时请注明来源链接)

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

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

  • 微信公众号

  • 商务合作