我当前使用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
请从Asynctask
的doinBackground
函数中调用您的服务意图。示例在这里:Asynctask
文档
您可以从UI中控制Asynctask
而无需持有UI以获得结果。