我目前正在使用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;
}
}
答案 0 :(得分:0)
请通过doinBackground
的{{1}}功能来调用您的服务意图。示例如下:Asynctask
documentation
您可以从UI控制Asynctask
,而无需保留结果用户界面。
答案 1 :(得分:0)
AsyncTask
不能限制其中的内容可以运行多长时间?这些第一次在我的应用程序中运行时,它们可以运行几分钟。
您可以在Threading performance文章中找到查询的答案。
使用AsyncTask时,需要记住一些重要的性能方面。
首先,默认情况下,应用程序将其创建的所有AsyncTask对象推送到单个线程中。因此,它们以串行方式执行,并且 - 与主线程一样 - 特别长的工作包可以阻塞队列。 出于这个原因,我们建议您仅使用AsyncTask 处理持续时间小于5毫秒的工作项
HandlerThread和ThreadPoolExecutor提供了其他替代方案。
您可以在此帖中找到HandlerThread
的示例代码: