在我的应用程序中,我需要分两个部分执行一个方法。 目的是获得时刻A和时刻B之间的值的比率。 问题是在时刻B之前,如果我的应用程序在后台运行,线程将被忽略。确实,Android CPU不再关注此线程。 无论我尝试了什么,我仍然无法按照我的意愿运行它,任何想法都将受到欢迎。
我为此使用了一个ExecutorService,该服务使我的两个Runnable线程(第一个任务,第二个任务)由计时器安排。我肯定添加了Wake Lock参数,并且还在使用服务将其作为后台线程执行。
Android清单:
<uses-permission android:name="android.permission.WAKE_LOCK" />
<application
...
<service
android:name=".AnalysisService"
android:exported="false"></service>
</application>
Analysis.java:
public static void runAnalysis(final Context context, final Analysis toRun){
try{
final Runnable firstTask = new Runnable() {
@Override
public void run() {
launchWakeLock(context);
startAnalysis(context, toRun);
}
};
final Runnable secondTask = new Runnable() {
@Override
public void run() {
if(isStillRunning(context,toRun)){
finishAnalysis(context, toRun);
getResult(context, toRun.getId());
showNotification(context, toRun);
}
stopWakeLock(context);
}
};
final ExecutorService executorService = Executors.newScheduledThreadPool(2);
Date dateStart = new Date();
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.SECOND, toRun.getDuration()*60);
Date dateEnd = calendar.getTime();
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
executorService.execute(firstTask);
}
}, dateStart);
timer.schedule(new TimerTask() {
@Override
public void run() {
executorService.execute(secondTask);
}
}, dateEnd);
}catch(Exception ex){
System.out.println(ex);
}
}
Service.java:
@Override
protected void onHandleIntent(Intent intent) {
if (intent != null) {
final Analysis analysis = (Analysis) intent.getExtras().getSerializable(Analysis.extraIntentPath);
if(analysis != null){
Analysis.runAnalysis(getApplicationContext(), analysis);
}
}
}