使用主线程将Firebase JobDisPatcher触发到BG线程中



我当前使用firebase jobdispatcher使用服务意图在后台进行定期检查(在boot,install,install& update上注册)。这正常工作,并且会产生其自己的线程与主线程分开,因此我不锁定UI,并且可以正确杀死该线程,因此垃圾收集不会成为问题。

我也想从应用程序内主线触发同样的精确工作。问题在于,运行JobDisPatcher拨打弹药会触发作业以在主UI线程中运行,而不是在背景线程中运行。我的功能之一可以产生很多对象,因此即使它正确运行,它也会杀死应用中的可用性,因为GC永远无法摆脱所有垃圾。

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

非常感谢您的帮助。

编辑此特定用法

我的特殊情况涉及第一次运行,updateNetworkerjob.class可能需要几分钟才能运行。phonehistoryCheck.getLastCallCallCallCallecked()函数具有一个循环,该循环拨打了Firebase的几个呼叫,既可以检索和列出信息。

9/12 Update

随后的运行非常快,异步可以工作。但是,我发现我需要一个更强大的解决方案,并且目前正在寻找ThreadPoolExecutor。GetLastCallCalled()函数可能会向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;
}
}

AsyncTask对内部可以运行多长时间有限制吗?这些在我的应用程序中首次运行时,它们可以运行几分钟。

您可以在线程性能文章中找到查询的答案。

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

首先,默认情况下,一个应用将其创建到单个线程中的所有异步对象。因此,他们以串行方式执行,并且(与主线程一样),特别是长时间的工作包可以阻止队列。因此,我们建议您仅使用asynctask进行处理工作项目,持续时间短于5ms

HandlerThread和ThreadPoolExecutor提供其他替代方案。

您可以在这篇文章中找到HandlerThread的示例代码:

从Android

中呼叫主线程

请从AsynctaskdoinBackground函数中调用您的服务意图。示例在这里:Asynctask文档

您可以从UI中控制Asynctask而无需持有UI以获得结果。

相关内容

  • 没有找到相关文章

最新更新