如何在android应用程序的后台正确运行计算?

如何在android应用程序的后台正确运行计算?,android,service,android-asynctask,background-process,reset,Android,Service,Android Asynctask,Background Process,Reset,我正在尝试在应用程序中运行一些简单的计算,我希望它始终运行,即使应用程序不可见/不活动。我查找了一些可能性,最后使用了ASyncTask。然而,当我试图执行它时,它实际上并没有在后台运行。准确地说,它根本没有运行。 所以我的问题是:AsyncTask真的是进行此计算的最佳方法,还是我应该使用服务或其他方法?如果ASyncTask是正确的方法,那么我做错了什么 以下是相关代码: public class MainActivity extends AppCompatActivity impleme

我正在尝试在应用程序中运行一些简单的计算,我希望它始终运行,即使应用程序不可见/不活动。我查找了一些可能性,最后使用了ASyncTask。然而,当我试图执行它时,它实际上并没有在后台运行。准确地说,它根本没有运行。 所以我的问题是:AsyncTask真的是进行此计算的最佳方法,还是我应该使用服务或其他方法?如果ASyncTask是正确的方法,那么我做错了什么

以下是相关代码:

 public class MainActivity extends AppCompatActivity implements SensorEventListener{

    long startTime = System.nanoTime();


    public class resetSpm extends AsyncTask<Void, Void, Void> {
    @Override
    protected Void doInBackground(Void... voids) {
        if((System.nanoTime() - startTime) > 2000000000) {
            //some simple calculation
        }
        return null;
      }
    }


    @Override
    public void onStart() {
        super.onStart();

        new resetSpm().execute();
    }
}
然后,我在onCreate中启动它,如下所示:

Intent spmReset = new Intent(this, SpmResetService.class);
    startService(spmReset);
我还使用

<service
        android:name="SpmResetService"
        >
    </service>


但在这里,它告诉我这个服务的名称无法解析。

首先,您应该了解哪些是专门为此目的而设计的

您无法从doInBackground处理UI,这可以通过onPostExecute方法实现

还可以在doInBackground方法中放入调试消息,以查看任务是否正在执行。理想情况下,您应该为此使用调试器,但目前应该使用日志语句

  protected Void doInBackground(Void... voids) {
    Log.d("MyApp", "In doInBackground");

    if((System.nanoTime() - startTime) > 2000000000) {
        //some simple calculation
       Log.d("MyApp", "Executing if block");
    }
    return null;
  }

还要确保您正在检查的条件是真的,在这种情况下,它似乎是假的。

首先,您应该查看哪些条件是专门为此目的而设计的

您无法从doInBackground处理UI,这可以通过onPostExecute方法实现

还可以在doInBackground方法中放入调试消息,以查看任务是否正在执行。理想情况下,您应该为此使用调试器,但目前应该使用日志语句

  protected Void doInBackground(Void... voids) {
    Log.d("MyApp", "In doInBackground");

    if((System.nanoTime() - startTime) > 2000000000) {
        //some simple calculation
       Log.d("MyApp", "Executing if block");
    }
    return null;
  }


还要确保您正在检查的条件为真,在这种情况下,它似乎为假。

2个问题;是否希望计算在不确定的时间内完成后重复?计算的效果会影响UI吗?它应该总是在不确定的时间内运行ao。现在它确实会影响UI,这样我就可以看到它是否进行计算,但最终它可能不需要运行,因为AsyncTasks只运行一次,在第一次调用时,类调用和onStart之后还没有过2秒,因此它使if语句失败。如果您希望在应用程序处于后台时重复此操作,则需要一个
服务
。我试着设置了一个,但没有任何结果。2个问题;是否希望计算在不确定的时间内完成后重复?计算的效果会影响UI吗?它应该总是在不确定的时间内运行ao。现在它确实会影响UI,这样我就可以看到它是否进行计算,但最终它可能不需要运行,因为AsyncTasks只运行一次,在第一次调用时,类调用和onStart之后还没有过2秒,因此它使if语句失败。如果您希望在应用程序处于后台时重复此操作,则需要一个
服务
。我试着建立了一个没有任何结果。很好。如果有任何问题,请告诉我。我确实有。它不起作用了。这项服务似乎从未创建过。你能更具体一点吗,如果需要请粘贴代码。你可以创建一个新问题并将链接粘贴到这里。我现在无法发布其他问题,但我编辑了此线程。日志中没有显示任何与服务相关的内容。如果有任何问题,请告诉我。我确实有。它不起作用了。这项服务似乎从未创建过。你能更具体一点吗,如果需要请粘贴代码。您可以创建一个新问题并将链接粘贴到此处。我现在无法发布其他问题,但我确实编辑了此线程。顺便说一下,日志中没有显示任何与服务相关的内容