我目前正在使用 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;
}
}