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

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

  1. package zhangphil.app;
  2.  
  3. import android.os.SystemClock;
  4. import android.support.annotation.NonNull;
  5. import android.support.annotation.Nullable;
  6. import android.util.Log;
  7.  
  8. import com.birbit.android.jobqueue.Job;
  9. import com.birbit.android.jobqueue.Params;
  10. import com.birbit.android.jobqueue.RetryConstraint;
  11.  
  12. /**
  13. * Created by Phil on 2016/11/2.
  14. */
  15.  
  16. public class JobA extends Job {
  17.  
  18. private String tag;
  19.  
  20. private String result;
  21.  
  22. public String getResult() {
  23. return result;
  24. }
  25.  
  26. public JobA(String tag) {
  27. super(new Params(500).requireNetwork().persist().groupBy(tag));
  28. this.tag = tag;
  29. Log.d(tag, "构造");
  30. }
  31.  
  32. @Override
  33. public void onAdded() {
  34. Log.d(tag, "onAdded");
  35. }
  36.  
  37. @Override
  38. public void onRun() throws Throwable {
  39. Log.d(tag, "开始运行...");
  40. SystemClock.sleep(3000);
  41. result = tag + "的结果:" + System.currentTimeMillis();
  42. Log.d(tag, "完成:" + result);
  43. }
  44.  
  45. @Override
  46. protected void onCancel(int cancelReason, @Nullable Throwable throwable) {
  47.  
  48. }
  49.  
  50. @Override
  51. protected RetryConstraint shouldReRunOnThrowable(@NonNull Throwable throwable, int runCount, int maxRunCount) {
  52. return null;
  53. }
  54. }

JobB.java:

  1. package zhangphil.app;
  2.  
  3. import android.os.SystemClock;
  4. import android.support.annotation.NonNull;
  5. import android.support.annotation.Nullable;
  6. import android.util.Log;
  7.  
  8. import com.birbit.android.jobqueue.Job;
  9. import com.birbit.android.jobqueue.Params;
  10. import com.birbit.android.jobqueue.RetryConstraint;
  11.  
  12. /**
  13. * Created by Phil on 2016/11/2.
  14. */
  15.  
  16. public class JobB extends Job {
  17.  
  18. private String tag;
  19.  
  20. private String result;
  21.  
  22. public String getResult() {
  23. return result;
  24. }
  25.  
  26. public JobB(String tag) {
  27. super(new Params(500).requireNetwork().persist().groupBy(tag));
  28. this.tag = tag;
  29. Log.d(tag, "构造");
  30. }
  31.  
  32. @Override
  33. public void onAdded() {
  34. Log.d(tag, "onAdded");
  35. }
  36.  
  37. @Override
  38. public void onRun() throws Throwable {
  39. Log.d(tag, "开始运行...");
  40. SystemClock.sleep(3000);
  41. result = tag + "的结果:" + System.currentTimeMillis();
  42. Log.d(tag, "完成:" + result);
  43. }
  44.  
  45. @Override
  46. protected void onCancel(int cancelReason, @Nullable Throwable throwable) {
  47.  
  48. }
  49.  
  50. @Override
  51. protected RetryConstraint shouldReRunOnThrowable(@NonNull Throwable throwable, int runCount, int maxRunCount) {
  52. return null;
  53. }
  54. }

前台回调获得结果:

  1. package zhangphil.app;
  2.  
  3. import android.support.annotation.NonNull;
  4. import android.support.annotation.Nullable;
  5. import android.support.v7.app.AppCompatActivity;
  6. import android.os.Bundle;
  7. import android.util.Log;
  8.  
  9. import com.birbit.android.jobqueue.Job;
  10. import com.birbit.android.jobqueue.JobManager;
  11. import com.birbit.android.jobqueue.callback.JobManagerCallback;
  12.  
  13. public class MainActivity extends AppCompatActivity {
  14.  
  15. @Override
  16. protected void onCreate(Bundle savedInstanceState) {
  17. super.onCreate(savedInstanceState);
  18. //setContentView(R.layout.activity_main);
  19.  
  20. JobManager jobManager = MyApplication.getInstance().getJobManager();
  21.  
  22. JobA a = new JobA("任务->A");
  23. JobA b = new JobA("任务->B");
  24. jobManager.addJobInBackground(a);
  25. jobManager.addJobInBackground(b);
  26.  
  27. jobManager.addCallback(new JobManagerCallback() {
  28. @Override
  29. public void onJobAdded(@NonNull Job job) {
  30.  
  31. }
  32.  
  33. @Override
  34. public void onJobRun(@NonNull Job job, int resultCode) {
  35.  
  36. }
  37.  
  38. @Override
  39. public void onJobCancelled(@NonNull Job job, boolean byCancelRequest, @Nullable Throwable throwable) {
  40.  
  41. }
  42.  
  43. @Override
  44. public void onDone(@NonNull Job job) {
  45. if (job instanceof JobA) {
  46. JobA a = (JobA) job;
  47. Log.d("返回", a.getResult());
  48. }
  49.  
  50. if (job instanceof JobB) {
  51. JobB b = (JobB) job;
  52. Log.d("返回", b.getResult());
  53. }
  54. }
  55.  
  56. @Override
  57. public void onAfterJobRun(@NonNull Job job, int resultCode) {
  58.  
  59. }
  60. });
  61. }
  62. }

需要注意须用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

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

  1. Android Priority Job Queue (Job Manager):后台线程任务结果传回前台(三)

     Android Priority Job Queue (Job Manager):后台线程任务结果传回前台(三) 在附录文章4,5的基础上改造MainActivity.java和MyJob.ja ...

  2. Android Priority Job Queue (Job Manager):线程任务的容错重启机制(二)

     Android Priority Job Queue (Job Manager):线程任务的容错重启机制(二) 附录文章4简单介绍了如何启动一个后台线程任务,Android Priority J ...

  3. Android Priority Job Queue (Job Manager)(一)

     Android Priority Job Queue (Job Manager)(一) 一.为什么要引入Android Priority Job Queue (Job Manager)?如今的A ...

  4. 案例复现,带你分析Priority Blocking Queue比较器异常导致的NPE问题

    摘要:本文通过完整的案例复现来演示在什么情况会触发该问题,同时给出了处理建议.希望读者在编程时加以借鉴,避免再次遇到此类问题. 本文分享自华为云社区<Priority Blocking Queu ...

  5. 【Android开发日记】第一个任务Android Service!Service靴+重力感应器+弹出窗口+保持执行

    前言: 近期在写一个小程序,需求是手机摇一摇就弹窗出来.第一次使用了Service,学习了两天,实现了Service弹窗,开机启动,Service启动和销毁,Service保持一直执行. 满足了自己的 ...

  6. Android学习笔记:多个AsyncTask实例的并发问题

    AsyncTask是Android给开发者提供的一个简单轻量级的多线程类,通过它我们可以很容易新建一个线程让在后台做一些耗时的操作(如IO操作.网络访问等),并在这个过程中更新UI.之所以说它轻量级, ...

  7. hadoop之 node manager起不来, 执行mapreduce 程序hang住

    现象: node manager起不来, 执行mapreduce 程序hang住 namenode 进程状态查询[root@hadp-master sbin]# jps8608 ResourceMan ...

  8. 066 01 Android 零基础入门 01 Java基础语法 08 Java方法 02 带参有返回值方法

    066 01 Android 零基础入门 01 Java基础语法 08 Java方法 04 带参有返回值方法 本文知识点:带参有返回值方法 说明:因为时间紧张,本人写博客过程中只是对知识点的关键步骤进 ...

  9. 065 01 Android 零基础入门 01 Java基础语法 08 Java方法 02 带参无返回值方法

    065 01 Android 零基础入门 01 Java基础语法 08 Java方法 03 带参无返回值方法 本文知识点:带参无返回值方法 说明:因为时间紧张,本人写博客过程中只是对知识点的关键步骤进 ...

随机推荐

  1. Unity中Collider和刚体Collider性能对比

    测试方式: 每个对象做大范围正弦移动,创建1000-5000个对象,保证场景分割树的实时更新,并测试帧率 测试脚本: 移动脚本: using UnityEngine; using System.Col ...

  2. Android中插件开发篇之----类加载器

    关于插件,已经在各大平台上出现过很多,eclipse插件.chrome插件.3dmax插件,所有这些插件大概都为了在一个主程序中实现比较通用的功能,把业务相关或者让可以让用户自定义扩展的功能不附加在主 ...

  3. QT mainwindow四件套

    最近在学习QT.下面总结一下mainwindow的设置步骤. 使用的平台为vs2013+qt5.3.2+qt-vs-addin1.2.3 1)安装软件 首先安装vs2013,这个不多介绍. 然后安装q ...

  4. Codeforces 720A. Closing ceremony

    A. Closing ceremony time limit per test 2 seconds memory limit per test 256 megabytes The closing ce ...

  5. FireFox中iframe的返回上页问题

    -----已测试,可以使用----- 原文地址链接:http://fansofjava.iteye.com/blog/1019852 在写静态页面过程中遇到了FF的history.back()和his ...

  6. phonegap开发经验谈之一命令行建立项目和准备工作

    一安装与配置 安装命令行配置,这个可以参见网上的.3.0的最好用命令行配置. 大家在安装android sdk的时候,会发现里面自带了一个eclipse,并且继承了adt,直接用这个就好了.当然你已经 ...

  7. js执行顺序<转>

    JavaScript执行引擎并非一行一行地分析和执行程序,而是一段一段地分析执行的.而且在分析执行同一段代码中,定义式的函数语句会被提取出来优先执行.函数定义执行完后,才会按顺序执行其他代码. 先看看 ...

  8. Django1.9开发博客(8)- 继续完善

    到现在为止我们已经完成的差不多了,并且基本的东西都已经学到了,是时候用起来了. 我们的博客还有很多功能需要完善,下面抛砖引玉新增几个功能,还有其他功能等你自己去发现和实现. 草稿箱 之前我们新建文章的 ...

  9. JavaScript数组API

    1.将数组转化为字符串:2种:               1.var str=String(str);                       将数组转化为字符串并分隔每个元素          ...

  10. iOS 视图控制器转场详解

    iOS 视图控制器转场详解 前言的前言 唐巧前辈在微信公众号「iOSDevTips」以及其博客上推送了我的文章后,我的 Github 各项指标有了大幅度的增长,多谢唐巧前辈的推荐.有些人问我相关的问题 ...