Android Priority Job Queue (Job Manager):后台线程任务结果传回前台(三)
Android Priority Job Queue (Job Manager):后台线程任务结果传回前台(三)
在附录文章4,5的基础上改造MainActivity.java和MyJob.java,改造后的代码,将使MyJob在后台完成线程任务后返回数据给前台。
实现的技术路线:
(1) 首先需要在MyJob里面定义一个结果值,假设这个值就是打算盛放后台线程计算结果的容器bean等等,然后当线程在后台计算完成后赋值。同时写一个public公共的get方法,这个get操作暴露给其他代码使用。
- 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/10/10.
- */
- public class MyJob extends Job{
- private String tag;
- //此处的结果将传回给发起线程的上层代码
- //比如经过一个耗时的长期后台线程完成后,一个结果获得,然后传回给需求方
- private String result;
- public MyJob(String tag) {
- super(new Params(500).requireNetwork().persist().groupBy(tag));
- this.tag = tag;
- Log.d(tag, "初始化");
- }
- public String getResult(){
- return result;
- }
- @Override
- public void onAdded() {
- Log.d(tag, "添加任务");
- }
- //在这里面放置耗时的后台线程化任务
- @Override
- public void onRun() throws Throwable {
- Log.d(tag, "开始运行...");
- SystemClock.sleep(10000);
- //此处抛出异常后,jobqueue将立即自动进入shouldReRunOnThrowable
- //throw new Exception();
- result="任务完成!";
- Log.d(tag,"完成");
- }
- @Override
- protected RetryConstraint shouldReRunOnThrowable(@NonNull Throwable throwable, int runCount, int maxRunCount) {
- // An error occurred in onRun.
- // Return value determines whether this job should retry or cancel. You can further
- // specify a backoff strategy or change the job's priority. You can also apply the
- // delay to the whole group to preserve jobs' running order.
- Log.d(tag, "runCount: " + runCount + " maxRunCount: " + maxRunCount);
- //这样的返回将导致onRun方法的再次执行,重启线程,重启将导致代码再次进入onRun。同时,runCount自加1
- return RetryConstraint.RETRY;
- }
- //如果重试超过限定次数,将onCancel.
- //如果用户主动放弃删掉这个任务,也一样进入onCancel
- @Override
- protected void onCancel(int cancelReason, @Nullable Throwable throwable) {
- Log.d(tag, "放弃:" + cancelReason);
- }
- @Override
- protected int getRetryLimit() {
- //仅仅重启5次次,超过5次则放弃任务。
- return 5;
- }
- }
(2) JobManager添加后台线程任务时候,重写回调方法,在回调里面等待结果。
- 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 {
- private JobManager jobManager;
- private String tag=this.getClass().getName();
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- //setContentView(R.layout.activity_main);
- jobManager=MyApplication.getInstance().getJobManager();
- MyJob job=new MyJob("任务1");
- jobManager.addJobInBackground(job);
- 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) {
- MyJob myJob= (MyJob) job;
- Log.d(tag,job.getId()+" onDone : "+myJob.getResult());
- }
- @Override
- public void onAfterJobRun(@NonNull Job job, int resultCode) {
- }
- });
- }
- }
代码运行结果:
附录:
【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):后台线程任务结果传回前台(三)的更多相关文章
- Android Priority Job Queue (Job Manager):线程任务的容错重启机制(二)
Android Priority Job Queue (Job Manager):线程任务的容错重启机制(二) 附录文章4简单介绍了如何启动一个后台线程任务,Android Priority J ...
- Android Priority Job Queue (Job Manager):多重不同Job并发执行并在前台获得返回结果(四)
Android Priority Job Queue (Job Manager):多重不同Job并发执行并在前台获得返回结果(四) 在Android Priority Job Queue (Jo ...
- Android Priority Job Queue (Job Manager)(一)
Android Priority Job Queue (Job Manager)(一) 一.为什么要引入Android Priority Job Queue (Job Manager)?如今的A ...
- Android中UI线程与后台线程交互设计的5种方法
我想关于这个话题已经有很多前辈讨论过了.今天算是一次学习总结吧. 在android的设计思想中,为了确保用户顺滑的操作体验.一 些耗时的任务不能够在UI线程中运行,像访问网络就属于这类任务.因此我们必 ...
- Android中后台线程如何与UI线程交互
我想关于这个话题已经有很多前辈讨论过了.今天算是一次学习总结吧. 在android的设计思想中,为了确保用户顺滑的操作体验.一些耗时的任务不能够在UI线程中运行,像访问网络就属于这类任务.因此我们必须 ...
- C#夯实基础之多线程二:主线程、前台线程与后台线程
我们在<C#夯实基础之多线程一:初识多线程>一文中第二部分中指出,既然windows最终发展出了多线程模型,按理说,我们直接使用一个.NetFramework的线程类就可以直接撸代码了,但 ...
- Android的UI设计与后台线程交互
本文将讨论Android应用程序的线程模型以及如何使用线程来处理耗时较长的操作,而不是在主线程中执行,保证用户界面(UI)的流畅运行.本文还将阐述一些用户界面(UI)中与线程交互的API.UI用户界面 ...
- Android 后台线程,timertask实现定期更新时间
简述:这是一类定时功能的原型,用来在后台线程中运行一些定时的服务,比如定时修改时间 知识点: 1. Android多线程的消息通信(handler) 2. Java中时间的获取,以及String的格式 ...
- Android中UI线程与后台线程交互设计的6种方法
在android的设计思想中,为了确保用户顺滑的操作体验.一些耗时的任务不能够在UI线程中运行,像访问网络就属于这类任务.因此我们必须要重新开启 一个后台线程运行这些任务.然而,往往这些任务最终又会直 ...
随机推荐
- OC self和super
在OC中 1 self是一个指针,在每一个方法中都有一个self指针 2 self可以出现在所有的方法中(对象方法和类方法),不能在函数中 3 self指向调用者.(谁调用它就指向谁) 4 可以使用s ...
- express+nodecoffee写passport登录验证实例(一)
项目中要用到passport登录验证,环境如标题样:express框架,coffee模版引擎,node后台 一:建项目 直接用express命令建,虽然默认模版为jade,可以手动换成coffee哦. ...
- FZU 2092 收集水晶 bfs+记忆化搜索 or 暴力
题目链接:收集水晶 一眼看过去,觉得是普通的bfs,初始位置有两个.仔细想了想...好像如果这样的话..........[不知道怎么说...T_T] dp[12][12][12][12][210] 中 ...
- JS访问剪切板中的图片
google出来一个html2canvas,它利用canvas来渲染读取的DOM树,也就是说它只能截取document里的内容,如果要像qq截图那样,应该怎么做?用过百度的Ueditor编辑器的朋友都 ...
- bzoj 2037: [Sdoi2008]Sue的小球
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; struc ...
- fseek ftell rewind
下面几个函数的头文件 : <stdio.h> fseek int fseek( FILE *stream, long offset, int origin ); 第一个参数stream ...
- comboBox的id返回System.Data.DataRowView
关系到ComboBox的DataSource,DisplayMember和ValueMember属性的设置顺序的问题. ComboBox的DataSource属性为object类型,但是需要实现ILi ...
- 单位服务器发布tomcat的项目外网访问
首先 要有 外网IP 路由器做设置 开放端口(netstat -nao) 首先你要确定你有一个外网ip地址.如果你分配到的是一个局域网IP地址需要经过一系列的转换为外网ip地址 跟部署tomcat ...
- powershell小工具,efs加解密三剑客。
powershell efs 加密 解密 列出 decryption list --------前言:我编写这两个脚本的目的,大家不可不知!-------- 1 是为系统管理员,网管员编写 ...
- PDF创建及动态转换控件程序包ActivePDF Portfolio
ActivePDF Portfolio是将4个activePDF最优秀的服务器产品捆绑成一个价格适中的控件程序包.它提供了开发一个完整的服务器端的PDF解决方案所需的一切. 具体功能: activeP ...