Android Priority Job Queue (Job Manager):多重不同Job并发执行并在前台获得返回结果(四)

简介: Android Priority Job Queue (Job Manager):多重不同Job并发执行并在前台获得返回结果(四)在Android Priority Job Queue (Job Manager)中,如果两个或者若干多个完全不同的Job子任务并发执行,如何在前台获得返回结果呢?现在给出一个例子说明。


Android Priority Job Queue (Job Manager):多重不同Job并发执行并在前台获得返回结果(四)

在Android Priority Job Queue (Job Manager)中,如果两个或者若干多个完全不同的Job子任务并发执行,如何在前台获得返回结果呢?现在给出一个例子说明。
假设有两个完全不同的子任务JobA和JobB。当JobA任务完成后返回一个结果给前台回调,同样当任务JobB任务完成后返回一个结果给前台回调使用。
写两个Job:JobA和JobB。
JobA.java:

package zhangphil.app;

import android.os.SystemClock;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;

import com.birbit.android.jobqueue.Job;
import com.birbit.android.jobqueue.Params;
import com.birbit.android.jobqueue.RetryConstraint;

/**
 * Created by Phil on 2016/11/2.
 */

public class JobA extends Job {

    private String tag;

    private String result;

    public String getResult() {
        return result;
    }

    public JobA(String tag) {
        super(new Params(500).requireNetwork().persist().groupBy(tag));
        this.tag = tag;
        Log.d(tag, "构造");
    }

    @Override
    public void onAdded() {
        Log.d(tag, "onAdded");
    }

    @Override
    public void onRun() throws Throwable {
        Log.d(tag, "开始运行...");
        SystemClock.sleep(3000);
        result = tag + "的结果:" + System.currentTimeMillis();
        Log.d(tag, "完成:" + result);
    }

    @Override
    protected void onCancel(int cancelReason, @Nullable Throwable throwable) {

    }

    @Override
    protected RetryConstraint shouldReRunOnThrowable(@NonNull Throwable throwable, int runCount, int maxRunCount) {
        return null;
    }
}


JobB.java:

package zhangphil.app;

import android.os.SystemClock;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;

import com.birbit.android.jobqueue.Job;
import com.birbit.android.jobqueue.Params;
import com.birbit.android.jobqueue.RetryConstraint;

/**
 * Created by Phil on 2016/11/2.
 */

public class JobB extends Job {

    private String tag;

    private String result;

    public String getResult() {
        return result;
    }

    public JobB(String tag) {
        super(new Params(500).requireNetwork().persist().groupBy(tag));
        this.tag = tag;
        Log.d(tag, "构造");
    }

    @Override
    public void onAdded() {
        Log.d(tag, "onAdded");
    }

    @Override
    public void onRun() throws Throwable {
        Log.d(tag, "开始运行...");
        SystemClock.sleep(3000);
        result = tag + "的结果:" + System.currentTimeMillis();
        Log.d(tag, "完成:" + result);
    }

    @Override
    protected void onCancel(int cancelReason, @Nullable Throwable throwable) {

    }

    @Override
    protected RetryConstraint shouldReRunOnThrowable(@NonNull Throwable throwable, int runCount, int maxRunCount) {
        return null;
    }
}


前台回调获得结果:

package zhangphil.app;

import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import com.birbit.android.jobqueue.Job;
import com.birbit.android.jobqueue.JobManager;
import com.birbit.android.jobqueue.callback.JobManagerCallback;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_main);

        JobManager jobManager = MyApplication.getInstance().getJobManager();

        JobA a = new JobA("任务->A");
        JobA b = new JobA("任务->B");
        jobManager.addJobInBackground(a);
        jobManager.addJobInBackground(b);

        jobManager.addCallback(new JobManagerCallback() {
            @Override
            public void onJobAdded(@NonNull Job job) {

            }

            @Override
            public void onJobRun(@NonNull Job job, int resultCode) {

            }

            @Override
            public void onJobCancelled(@NonNull Job job, boolean byCancelRequest, @Nullable Throwable throwable) {

            }

            @Override
            public void onDone(@NonNull Job job) {
                if (job instanceof JobA) {
                    JobA a = (JobA) job;
                    Log.d("返回", a.getResult());
                }

                if (job instanceof JobB) {
                    JobB b = (JobB) job;
                    Log.d("返回", b.getResult());
                }
            }

            @Override
            public void onAfterJobRun(@NonNull Job job, int resultCode) {

            }
        });
    }
}

需要注意须用instanceof判断回调的实例是具体哪一个。



代码运行结果如图(添加关键词‘任务’过滤):


关于MyApplication的配置和写法和附录文章4,5,6相同。


附录:
【1】《Java线程池:ExecutorService,Executors》链接地址:http://blog.csdn.net/zhangphil/article/details/43898637  
【2】《Java线程池及Future、Callable获得线程返回结果【Java线程池系列2】》链接地址:http://blog.csdn.net/zhangphil/article/details/49701219
【3】《Java线程池之FutureTask【Java线程池系列3】》链接地址:http://blog.csdn.net/zhangphil/article/details/49702751
【4】《Android Priority Job Queue (Job Manager)(一)》链接地址:http://blog.csdn.net/zhangphil/article/details/52777196
【5】《Android Priority Job Queue (Job Manager):线程任务的容错重启机制(二)》链接地址:http://blog.csdn.net/zhangphil/article/details/52778525
【6】《 Android Priority Job Queue (Job Manager):后台线程任务结果传回前台(三)》链接:http://blog.csdn.net/zhangphil/article/details/52787588

相关文章
|
8月前
|
Android开发
Android中 Download Manager系统下载管理器在Android 10系统中无法使用的情况
Android中 Download Manager系统下载管理器在Android 10系统中无法使用的情况
234 0
|
开发工具 Android开发
Android SDK Manager无法显示可供下载的未安装SDK解决方案
Android SDK Manager无法显示可供下载的未安装SDK解决方案
445 0
|
开发工具 Android开发
Android studio 下的SDK Manager只显示已安装包的情况
      原因是连接不上Google的更新服务器:   解决方法:      选择第三个Options:     修改Http Proxy Server: mirrors.neusoft.edu.cn     Http Proxy Port: 80   选中 Others 下面的 Force htto://.
1787 0
|
Java Android开发
Android Priority Job Queue (Job Manager):后台线程任务结果传回前台(三)
 Android Priority Job Queue (Job Manager):后台线程任务结果传回前台(三) 在附录文章4,5的基础上改造MainActivity.java和MyJob.java,改造后的代码,将使MyJob在后台完成线程任务后返回数据给前台。
969 0
|
Java Android开发 调度
Android Priority Job Queue (Job Manager)(一)
 Android Priority Job Queue (Job Manager)(一) 一、为什么要引入Android Priority Job Queue (Job Manager)?如今的APP开发中,几乎绝大多数APP没有不需要后台线程操作和运行的任务,Android平台自身提供了一些后台线程的编程实现模型和API。
762 0
|
Java Android开发
Android Priority Job Queue (Job Manager):线程任务的容错重启机制(二)
 Android Priority Job Queue (Job Manager):线程任务的容错重启机制(二) 附录文章4简单介绍了如何启动一个后台线程任务,Android Priority Job Queue (Job Manager)有一个重要的机制在附录文章4还没有体现:线程任务失败后重试、重启线程任务。
833 0
|
开发工具 Android开发
Android SDK Manager更新不了的解决办法
引用:http://www.cnblogs.com/weisenz/archive/2012/09/20/2695486.html android SDK Manager更新不了,出现错误提示:"Failed to fetch URL.
977 0
|
4天前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
24 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
|
27天前
|
Java Android开发
Android 开发获取通知栏权限时会出现两个应用图标
Android 开发获取通知栏权限时会出现两个应用图标
14 0
|
1天前
|
数据库 Android开发 开发者
安卓应用开发:构建高效用户界面的策略
【4月更文挑战第24天】 在竞争激烈的移动应用市场中,一个流畅且响应迅速的用户界面(UI)是吸引和保留用户的关键。针对安卓平台,开发者面临着多样化的设备和系统版本,这增加了构建高效UI的复杂性。本文将深入分析安卓平台上构建高效用户界面的最佳实践,包括布局优化、资源管理和绘制性能的考量,旨在为开发者提供实用的技术指南,帮助他们创建更流畅的用户体验。