В моем приложении мне нужно выполнить метод в 2 части.Цель состоит в том, чтобы получить скорость значения между моментом A и моментом B. Проблема в том, что до момента B поток игнорируется, если мое приложение находится в фоновом режиме.Действительно, Android CPU больше не фокусируется на этой теме.Независимо от того, что я пробовал, я все равно не могу запустить его так, как хотел бы, любые идеи будут приветствоваться.
Я использую для этого ExecutorService, который сохраняет мои два потока Runnable (1-я задача, 2-я задача)быть запланированным таймером.Я наверняка добавил параметр 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);
}
}
}