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

在附录文章4,5的基础上改造MainActivity.java和MyJob.java,改造后的代码,将使MyJob在后台完成线程任务后返回数据给前台。
实现的技术路线:
(1) 首先需要在MyJob里面定义一个结果值,假设这个值就是打算盛放后台线程计算结果的容器bean等等,然后当线程在后台计算完成后赋值。同时写一个public公共的get方法,这个get操作暴露给其他代码使用。

  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/10/10.
  14. */
  15. public class MyJob extends Job{
  16.  
  17. private String tag;
  18.  
  19. //此处的结果将传回给发起线程的上层代码
  20. //比如经过一个耗时的长期后台线程完成后,一个结果获得,然后传回给需求方
  21. private String result;
  22.  
  23. public MyJob(String tag) {
  24. super(new Params(500).requireNetwork().persist().groupBy(tag));
  25. this.tag = tag;
  26. Log.d(tag, "初始化");
  27. }
  28.  
  29. public String getResult(){
  30. return result;
  31. }
  32.  
  33. @Override
  34. public void onAdded() {
  35. Log.d(tag, "添加任务");
  36. }
  37.  
  38. //在这里面放置耗时的后台线程化任务
  39. @Override
  40. public void onRun() throws Throwable {
  41. Log.d(tag, "开始运行...");
  42.  
  43. SystemClock.sleep(10000);
  44.  
  45. //此处抛出异常后,jobqueue将立即自动进入shouldReRunOnThrowable
  46. //throw new Exception();
  47.  
  48. result="任务完成!";
  49.  
  50. Log.d(tag,"完成");
  51. }
  52.  
  53. @Override
  54. protected RetryConstraint shouldReRunOnThrowable(@NonNull Throwable throwable, int runCount, int maxRunCount) {
  55. // An error occurred in onRun.
  56. // Return value determines whether this job should retry or cancel. You can further
  57. // specify a backoff strategy or change the job's priority. You can also apply the
  58. // delay to the whole group to preserve jobs' running order.
  59.  
  60. Log.d(tag, "runCount: " + runCount + " maxRunCount: " + maxRunCount);
  61.  
  62. //这样的返回将导致onRun方法的再次执行,重启线程,重启将导致代码再次进入onRun。同时,runCount自加1
  63. return RetryConstraint.RETRY;
  64. }
  65.  
  66. //如果重试超过限定次数,将onCancel.
  67. //如果用户主动放弃删掉这个任务,也一样进入onCancel
  68. @Override
  69. protected void onCancel(int cancelReason, @Nullable Throwable throwable) {
  70. Log.d(tag, "放弃:" + cancelReason);
  71. }
  72.  
  73. @Override
  74. protected int getRetryLimit() {
  75. //仅仅重启5次次,超过5次则放弃任务。
  76. return 5;
  77. }
  78. }

(2) JobManager添加后台线程任务时候,重写回调方法,在回调里面等待结果。

  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. private JobManager jobManager;
  16. private String tag=this.getClass().getName();
  17.  
  18. @Override
  19. protected void onCreate(Bundle savedInstanceState) {
  20. super.onCreate(savedInstanceState);
  21. //setContentView(R.layout.activity_main);
  22.  
  23. jobManager=MyApplication.getInstance().getJobManager();
  24.  
  25. MyJob job=new MyJob("任务1");
  26. jobManager.addJobInBackground(job);
  27.  
  28. jobManager.addCallback(new JobManagerCallback() {
  29. @Override
  30. public void onJobAdded(@NonNull Job job) {
  31.  
  32. }
  33.  
  34. @Override
  35. public void onJobRun(@NonNull Job job, int resultCode) {
  36.  
  37. }
  38.  
  39. @Override
  40. public void onJobCancelled(@NonNull Job job, boolean byCancelRequest, @Nullable Throwable throwable) {
  41.  
  42. }
  43.  
  44. @Override
  45. public void onDone(@NonNull Job job) {
  46. MyJob myJob= (MyJob) job;
  47. Log.d(tag,job.getId()+" onDone : "+myJob.getResult());
  48. }
  49.  
  50. @Override
  51. public void onAfterJobRun(@NonNull Job job, int resultCode) {
  52.  
  53. }
  54. });
  55. }
  56. }

代码运行结果:

附录:
【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

Android Priority Job Queue (Job Manager):后台线程任务结果传回前台(三)的更多相关文章

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

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

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

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

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

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

  4. Android中UI线程与后台线程交互设计的5种方法

    我想关于这个话题已经有很多前辈讨论过了.今天算是一次学习总结吧. 在android的设计思想中,为了确保用户顺滑的操作体验.一 些耗时的任务不能够在UI线程中运行,像访问网络就属于这类任务.因此我们必 ...

  5. Android中后台线程如何与UI线程交互

    我想关于这个话题已经有很多前辈讨论过了.今天算是一次学习总结吧. 在android的设计思想中,为了确保用户顺滑的操作体验.一些耗时的任务不能够在UI线程中运行,像访问网络就属于这类任务.因此我们必须 ...

  6. C#夯实基础之多线程二:主线程、前台线程与后台线程

    我们在<C#夯实基础之多线程一:初识多线程>一文中第二部分中指出,既然windows最终发展出了多线程模型,按理说,我们直接使用一个.NetFramework的线程类就可以直接撸代码了,但 ...

  7. Android的UI设计与后台线程交互

    本文将讨论Android应用程序的线程模型以及如何使用线程来处理耗时较长的操作,而不是在主线程中执行,保证用户界面(UI)的流畅运行.本文还将阐述一些用户界面(UI)中与线程交互的API.UI用户界面 ...

  8. Android 后台线程,timertask实现定期更新时间

    简述:这是一类定时功能的原型,用来在后台线程中运行一些定时的服务,比如定时修改时间 知识点: 1. Android多线程的消息通信(handler) 2. Java中时间的获取,以及String的格式 ...

  9. Android中UI线程与后台线程交互设计的6种方法

    在android的设计思想中,为了确保用户顺滑的操作体验.一些耗时的任务不能够在UI线程中运行,像访问网络就属于这类任务.因此我们必须要重新开启 一个后台线程运行这些任务.然而,往往这些任务最终又会直 ...

随机推荐

  1. OC self和super

    在OC中 1 self是一个指针,在每一个方法中都有一个self指针 2 self可以出现在所有的方法中(对象方法和类方法),不能在函数中 3 self指向调用者.(谁调用它就指向谁) 4 可以使用s ...

  2. express+nodecoffee写passport登录验证实例(一)

    项目中要用到passport登录验证,环境如标题样:express框架,coffee模版引擎,node后台 一:建项目 直接用express命令建,虽然默认模版为jade,可以手动换成coffee哦. ...

  3. FZU 2092 收集水晶 bfs+记忆化搜索 or 暴力

    题目链接:收集水晶 一眼看过去,觉得是普通的bfs,初始位置有两个.仔细想了想...好像如果这样的话..........[不知道怎么说...T_T] dp[12][12][12][12][210] 中 ...

  4. JS访问剪切板中的图片

    google出来一个html2canvas,它利用canvas来渲染读取的DOM树,也就是说它只能截取document里的内容,如果要像qq截图那样,应该怎么做?用过百度的Ueditor编辑器的朋友都 ...

  5. bzoj 2037: [Sdoi2008]Sue的小球

    #include<cstdio> #include<iostream> #include<algorithm> using namespace std; struc ...

  6. fseek ftell rewind

    下面几个函数的头文件 : <stdio.h>   fseek int fseek( FILE *stream, long offset, int origin ); 第一个参数stream ...

  7. comboBox的id返回System.Data.DataRowView

    关系到ComboBox的DataSource,DisplayMember和ValueMember属性的设置顺序的问题. ComboBox的DataSource属性为object类型,但是需要实现ILi ...

  8. 单位服务器发布tomcat的项目外网访问

    首先 要有 外网IP  路由器做设置  开放端口(netstat -nao) 首先你要确定你有一个外网ip地址.如果你分配到的是一个局域网IP地址需要经过一系列的转换为外网ip地址 跟部署tomcat ...

  9. powershell小工具,efs加解密三剑客。

    powershell  efs  加密  解密  列出  decryption  list --------前言:我编写这两个脚本的目的,大家不可不知!-------- 1 是为系统管理员,网管员编写 ...

  10. PDF创建及动态转换控件程序包ActivePDF Portfolio

    ActivePDF Portfolio是将4个activePDF最优秀的服务器产品捆绑成一个价格适中的控件程序包.它提供了开发一个完整的服务器端的PDF解决方案所需的一切. 具体功能: activeP ...