5

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

4

4 回答 4

8

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

如果您不在乎您的工作是否成功,或者您的工作是否花费很少的时间。

在我的一JobService堂课上,我正在做定期工作。我不担心处理失败。该任务将很快再次执行。如果是这种情况,您可以这样做。

    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(每个类都有一个单独的文件)。

    // common Strings
    public static final String IS_SUCCESS = "isSuccess";
    public static final String MY_BC_RCVR = "MyBroadcastRcvr";

您的JobService

    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

    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 类中。

我已经给出了一个AsyncTask基于Google Developer Advocate 的Medium 帖子(也由 Arseny Levin 引用)的示例,但它也应该可以使用IntentService(请参阅此SO 帖子以了解嵌套IntentService)。

    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);
                }
            }
        }
    }
于 2017-12-18T19:57:27.730 回答
5

如果您的onStartJob()方法返回true,则表示您正在后台进行工作以支持该工作。jobFinished()当工作完成或需要重新安排工作时,该后台线程需要调用。

于 2017-06-14T20:36:11.977 回答
2

一个简单的方法是从 onStartJob 开始一个新线程,如下所示:

@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;
    }
}
于 2019-06-17T10:45:52.357 回答
1

正如@CommonsWare 解释的那样——在里面onStartJob你将决定是否需要在后台线程上做进一步的工作。只有在这种情况下,您才应该jobFinished从该后台线程调用。只是为了回答您的具体问题 - 不需要代表您进行状态跟踪。如果您要求的条件不再成立,JobService将调用。onStopJob

示例jobFinished可以在这里找到: https ://medium.com/google-developers/scheduling-jobs-like-a-pro-with-jobscheduler-286ef8510129

于 2017-07-25T12:20:26.457 回答