zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    LightOJ
    LightOJ
    51Nod 1021~1023 石子合并 (逐步加强版) 【dp】
    BZOJ1036 [ZJOI2008]树的统计Count 【树链剖分+线段树维护】
    51Nod 1677 treecnt 【树形dp+组合数学+逆元】
    逆元 【数学】
    51Nod 1705七星剑 【概率dp】
    BZOJ 1064 [Noi2008]假面舞会 【bfs】
    51 nod 1443 路径和树 【最短路径】
    BZOJ 1013 [JSOI2008]球形空间产生器sphere 【高斯消元】
  • 原文地址:https://www.cnblogs.com/hehehaha/p/6147241.html
Copyright © 2011-2022 走看看