在两个不同的时刻在后台调度线程

时间:2019-05-21 16:46:10

标签: android cpu background-process

在我的应用程序中,我需要分两个部分执行一个方法。 目的是获得时刻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);

        }

    }

}

0 个答案:

没有答案