首页 > 其他分享 >安卓中实现异步任务的几种方式——常用的五种方式

安卓中实现异步任务的几种方式——常用的五种方式

时间:2022-10-21 14:07:49浏览次数:50  
标签:异步 方式 void mHandler 安卓中 msg new Message public

安卓中实现异步任务的几种方式

问题背景

在安卓日常开发中,经常需要使用到异步任务,现在把安卓中异步任务的几种主要使用方式简单总结一下,后面有需要会对他们每一种进行单独的细致介绍。

问题分析

(1)Thread(Runnable)结合handler实现

实现demo如下:

Handler mHandler = newHandler(){
    @Override
    publicvoid handleMessage(Message msg){
        if(msg.what == 1){
            textView.setText("Task Done!!");
        }
    }
};
mRunnable = new Runnable() {
    @Override
    publicvoid run() {
        // 模拟执行耗时操作
        SystemClock.sleep(1000);
        mHandler.sendEmptyMessage(1);  
    }
};
private void startTask(){
    // 启动子线程
    new Thread(mRunnable).start();
}

(2)结合AsyncTask实现

看下官方给的demo:

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {
         int count = urls.length;
         long totalSize = 0;
         for (int i = 0; i < count; i++) {
             totalSize += Downloader.downloadFile(urls[i]);
             publishProgress((int) ((i / (float) count) * 100));
             // Escape early if cancel() is called
             if (isCancelled()) break;
         }
         return totalSize;
     }
     protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);
     }
     protected void onPostExecute(Long result) {
         showDialog("Downloaded " + result + " bytes");
     }
}

实现AsyncTask的子类,主要实现其 doInBackground()、onProgressUpdate()、onPostExecute()方法。使用时创建对应对象调用即可。代码如下:

new DownloadFilesTask().execute(url1, url2, url3);

(3)基于HandlerThread实现

public class HandlerThreadTest {
    private final static String TAG = "HandlerThreadTest";
    private HandlerThread mHandlerThread = new HandlerThread("myHandlerThread", Process.THREAD_PRIORITY_BACKGROUND);
    private Handler mHandler = null;

    public void startHandlerthread(){
        mHandlerThread.start();
        if (mHandler == null){
            mHandler = new Handler(mHandlerThread.getLooper()){
                @Override
                public void handleMessage(@NonNull Message msg) {
                    super.handleMessage(msg);
                    switch (msg.what){
                        case 1:
                            Log.d(TAG, "收到消息,当前线程:" + Thread.currentThread());
                            break;
                    }
                }
            };
        }
    }
    public void sendMessage() {
        Log.d(TAG, "当前线程:" + Thread.currentThread());
        Message msg = Message.obtain();
        msg.what = 1;
        mHandler.sendMessage(msg);
    }
}

(4)IntentService的方式实现

我们来看下 IntentService 的主要方法:

    @Override
    public void onCreate() {
        // TODO: It would be nice to have an option to hold a partial wakelock
        // during processing, and to have a static startService(Context, Intent)
        // method that would launch the service & hand off a wakelock.

        super.onCreate();
        HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
        thread.start();

        mServiceLooper = thread.getLooper();
        mServiceHandler = new ServiceHandler(mServiceLooper);
    }

    @Override
    public void onStart(@Nullable Intent intent, int startId) {
        Message msg = mServiceHandler.obtainMessage();
        msg.arg1 = startId;
        msg.obj = intent;
        mServiceHandler.sendMessage(msg);
    }

    private final class ServiceHandler extends Handler {
        public ServiceHandler(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            onHandleIntent((Intent)msg.obj);
            stopSelf(msg.arg1);
        }
    }

我们只需要继承 IntentService,就可以在 onHandlerIntent 方法中异步处理 Intent 类型任务了。

(5)使用线程池来实现

利用 Executors 的静态方法 newCachedThreadPool()、newFixedThreadPool()、newSingleThreadExecutor() 及重载形式实例化 ExecutorService 接口即得到线程池对象。这个有机会后面会单独写篇文章介绍一下。

问题总结

本文大体介绍了安卓开发日常,经常使用到的几种实现异步任务的方案,后面有机会会对每一种单独进行细致的介绍。

标签:异步,方式,void,mHandler,安卓中,msg,new,Message,public
From: https://blog.51cto.com/baorant24/5782578

相关文章

  • Java多线程实现的四种方式
    实现多线程有以下四种方式实现多线程有以下四种方式:1.继承Thread类2.实现Runnable接口3.实现Callable接口4.线程池:提供了一个线程队列,队列中保存着所有等待状态的线程......
  • python3 quick_ratio计算结果不稳定的解决方式
    网上找不到,也许是大家都不用,个人遇到了,所以记录下解决方案seq=difflib.SequenceMatcher(None)seq是一个类,计算结果会存起来当使用单例模式时,上一次计算结果会影响本......
  • CentOS 7上安装 Jenkins 2.346 -- yum 方式
    CentOS7上安装Jenkins--yum方式https://mirrors.jenkins.io/war/开源Devops工具Jenkins在官方博客宣布,从6月28日发布的Jenkins2.357和将于9月发布的......
  • k8s集群yaml文件方式迁移
    一、安装依赖工具实际就是导出数据为json,通过jq删除一些不需要的字段,然后再通过yq转换为yaml格式(不安装直接使用json格式也可以安装,这里主要为例方便查看),这么麻烦主要是......
  • Windows打开回收站的几种方式
    1.桌面双击回收站图标打开回收站,简单、快捷、方便,但在打开多个窗口时候还要最小化这些窗口以显示桌面,如果还要迅速恢复这些窗口的话也算是麻烦2.磁盘每个分区根目录下都......
  • python 异步任务框架 celery
    简介celery是一个分布式任务调度框架,由python编写。它专注于实时处理,在任务发布后,管理分配任务到不同的服务器,并取得结果。在执行任务分配时需要一个消息中间件(Broker),......
  • Linux的三种网络连接方式
    Linux的三种网络连接方式1.桥接模式虚拟系统可以和外部系统通讯,但是容易造成IP冲突2.NAT模式网络地址转换模式,虚拟系统可以和外部通讯,不造成IP冲突3.主机模式独立的......
  • 印象笔记的高效使用方式
    印象笔记使用思路:笔记软件很多,能够做笔记的软件也很多,使用每种软件,务必充分发挥其优势才有意义。使用了印象笔记这么久,体会到以下几点:一、充分利用网页裁剪功能。网页裁剪......
  • jenkins的几种构建方式
    几种构建方式快照依赖构建/BuildwheneveraSNAPSHOTdependencyisbuilt当依赖的快照被构建时执行本job触发远程构建(例如,使用脚本)远程调用本job的restapi时......
  • CentOS 7上安装 Jenkins -- yum 方式
    CentOS7上安装Jenkins--yum方式安装Jenkins开源Devops工具Jenkins在官方博客宣布,从6月28日发布的Jenkins2.357和将于9月发布的LTS版本开始,Jenkins......