首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓:如何使用JobService的JobFinished

安卓:如何使用JobService的JobFinished
EN

Stack Overflow用户
提问于 2017-06-15 04:33:57
回答 4查看 8.9K关注 0票数 5

我没有看到使用JobService的jobFinshed的例子,似乎我们必须跟踪某些条件满足时的变化,我们必须调用jobFinished()方法,对吗?

EN

回答 4

Stack Overflow用户

发布于 2017-12-19 03:57:28

从另一个类(如IntentService )调用jobFinished()的困难似乎在于获取类的一个实例,该实例扩展了JobService以用于调用jobFinished()。您可以获取有关计划作业的信息,但不能从JobService获取信息(至少,我找不到方法)。我能想到3种调用jobFinished()的方法。

如果你不关心你的工作是否成功,或者你的工作是否花费很少的时间。

在我的一个JobService类中,我正在做周期性的工作。我并不担心处理失败。该任务很快就会再次执行。如果是这样的话,你可以这样做。

代码语言:javascript
复制
    public boolean onStartJob(JobParameters params) {
        startService(new Intent(this, MyIntentServiceThatDoesTheWork.class));

        // job not really finished here but we assume success & prevent backoff procedures, wakelocking, etc.
        jobFinished(params, false);
        return true;
    }

这也是你想要做的方式,如果你的工作足够短,在UI线程上做也没有问题。在这种情况下,在onStartJob()中完成所有工作,然后返回false。

使用BroadcastReceiver将消息从IntentService发送到JobService (每个类一个单独的文件)。

代码语言:javascript
复制
    // common Strings
    public static final String IS_SUCCESS = "isSuccess";
    public static final String MY_BC_RCVR = "MyBroadcastRcvr";

你的JobService

代码语言:javascript
复制
    public class MyJobService extends JobService {
        JobParameters mParams;

        public boolean onStartJob(JobParameters params) {
            mParams = params;
            LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
                    new IntentFilter(MY_BC_RCVR));
            startService(new Intent(this, MyIntentServiceThatDoesTheWork.class));
            return true;
        }

        private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                boolean isSuccess = false;
                if(intent.hasExtra(IS_SUCCESS)) {
                    isSuccess = intent.getBooleanExtra(IS_SUCCESS, false);
                }
                LocalBroadcastManager.getInstance(context).unregisterReceiver(this);
                jobFinished(mParams, !isSuccess);
            }
        };
    }

您的IntentService

代码语言:javascript
复制
    public class MyIntentServiceThatDoesTheWork extends IntentService {
        @Override
        protected void onHandleIntent(Intent intent) {

            boolean isSuccess = methodToDoAllMyWork();
            Intent bcIntent = new Intent(MY_BC_RCVR);
            bcIntent.putExtra(IS_SUCCESS, isSuccess);
            LocalBroadcastManager.getInstance(this).sendBroadcast(bcIntent);
        }
    }

将工作线程类嵌套在JobService类中。

我已经给出了一个来自谷歌开发者倡导者的基于这个Medium post (也是由also引用的)的AsyncTask的例子,但它也应该可以使用IntentService (请参阅此SO post了解嵌套IntentService)。

代码语言:javascript
复制
    public class MyJobService extends JobService {
        JobParameters mParams;

        public boolean onStartJob(JobParameters params) {
            mParams = params;
            new MyAsyncTaskThatDoesTheWork().execute();
            return true;
        }

        private class MyAsyncTaskThatDoesTheWork extends AsyncTask<Void, Void, Boolean> {
            @Override
            protected Boolean doInBackground(Void... params) {
                return methodToDoAllMyWork();
            }

            @Override
            protected void onPostExecute(Boolean isSuccess) {
                if(mParams != null) {
                    jobFinished(mParams, !isSuccess);
                }
            }
        }
    }
票数 8
EN

Stack Overflow用户

发布于 2017-06-15 04:36:12

如果您的onStartJob()方法返回true,这意味着您正在后台执行支持此作业的工作。当该工作已完成或需要重新调度该作业时,该后台线程需要调用jobFinished()

票数 5
EN

Stack Overflow用户

发布于 2019-06-17 18:45:52

一种简单的方法是从onStartJob启动一个新线程,如下所示:

代码语言:javascript
复制
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public class MyJobService extends JobService {
    @Override
    public boolean onStartJob(final JobParameters params) {
      new Thread(new Runnable() {
        @Override
        public void run() {

            // do your job here

            jobFinished(params, true);
        }
      }).start();

      return true;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
      return true;
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44554256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档