• 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

  • 相关阅读:
    bzoj 1017 魔兽地图DotR
    poj 1322 chocolate
    bzoj 1045 糖果传递
    poj 3067 japan
    timus 1109 Conference(二分图匹配)
    URAL 1205 By the Underground or by Foot?(SPFA)
    URAL 1242 Werewolf(DFS)
    timus 1033 Labyrinth(BFS)
    URAL 1208 Legendary Teams Contest(DFS)
    URAL 1930 Ivan's Car(BFS)
  • 原文地址:https://www.cnblogs.com/hehehaha/p/6147249.html
Copyright © 2020-2023  润新知