使用主线程将Firebase JobDispatcher触发到BG线程

时间:2017-09-11 17:47:41

标签: android multithreading firebase firebase-job-dispatcher

我目前正在使用Firebase JobDispatcher使用服务意图(在启动,安装和更新时注册)在后台运行定期检查。这是正常的,它产生了自己的主线程独立的线程,因此我不会锁定UI,它会正确杀死线程,因此垃圾收集不会成为问题。

我还想从应用程序中的主线程触发同样的确切工作。问题是运行jobdispatcher onCreate会触发作业在主UI线程中运行,而不是在后台线程中运行。我的一个函数可以生成大量的对象,所以即使它正确运行,它也会杀死应用程序中的可用性,因为GC永远无法摆脱所有垃圾。

如何从主线程按需运行现有JobDispatcher作业,但仍在单独的线程中?

非常感谢你的帮助。

编辑以澄清此特定用法

我的特殊情况涉及第一次运行,其中UpdateNetworkerJob.class可能需要几分钟才能运行。 phoneHistoryCheck.GetLastCallChecked()函数有一个循环,可以对Firebase进行多次调用,包括检索和放置信息。

9/12更新

后续运行非常快,AsyncTask可以工作。但是我发现我需要一个更强大的解决方案,目前正在考虑ThreadPoolExecutor。可能GetLastCallChecked()函数在Firebase引擎上投入太多,导致主线程对Firebase的调用在消除时会降低噪声。我正在努力对这部分进行整理。

主线程中的代码开始工作:

FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(trackedContactListActivity.this));
        Job myJob = dispatcher.newJobBuilder()
                .setService(UpdateNetworkerJob.class)
                .setTag("UpdateNetworkerService")
                .setTrigger(Trigger.NOW)
                .setConstraints(
                        Constraint.ON_ANY_NETWORK
                )
                .build();

        dispatcher.mustSchedule(myJob);

UpdateNetworkerJob.class

public class UpdateNetworkerJob extends JobService {

private static final String TAG = "UpdateNetworkerJob";

@Override
public boolean onStartJob(final JobParameters params) {


    Log.d(TAG, "UpdateNetworkerJob is running with params: " + params);
    PhoneHistoryCheck phoneHistoryCheck = new PhoneHistoryCheck();
    phoneHistoryCheck.GetLastCallChecked(UpdateNetworkerJob.this);



    return false;
}

@Override
public boolean onStopJob(JobParameters params) {
    // Stop tracking these job parameters, as we've 'finished' executing.
    //sendMessage(MSG_COLOR_STOP, params.getJobId());
    Log.d(TAG, "on stop job: " + params);

    // Return false to drop the job.
    return false;
}
}

2 个答案:

答案 0 :(得分:0)

请通过doinBackground的{​​{1}}功能来调用您的服务意图。示例如下:Asynctask documentation

您可以从UI控制Asynctask,而无需保留结果用户界面。

答案 1 :(得分:0)

  

AsyncTask不能限制其中的内容可以运行多长时间?这些第一次在我的应用程序中运行时,它们可以运行几分钟。

您可以在Threading performance文章中找到查询的答案。

使用AsyncTask时,需要记住一些重要的性能方面。

首先,默认情况下,应用程序将其创建的所有AsyncTask对象推送到单个线程中。因此,它们以串行方式执行,并且 - 与主线程一样 - 特别长的工作包可以阻塞队列。 出于这个原因,我们建议您仅使用AsyncTask 处理持续时间小于5毫秒的工作项

HandlerThreadThreadPoolExecutor提供了其他替代方案。

您可以在此帖中找到HandlerThread的示例代码:

Call Main thread from secondary thread in Android