我试图在应用程序中运行一些简单的计算,并且我希望它始终运行,即使应用程序不可见/活动。我查找了一些可能性,并最终使用ASyncTask。但是,当我尝试执行它时,它实际上并未在后台运行。确切地说,它完全没有运行。 所以我的问题是:是AsyncTask真的是做这种计算的最佳方式,还是应该使用服务或其他?如果ASyncTask是正确的做法,我做错了什么?如何在Android应用程序的后台正常运行计算?
下面是相关代码:
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没有结果的执行。
if((System.nanoTime() - startTime)> 2000000000){...}在那里,而不是一个计时器,因为我也将startTime设置为其他时间。 这部分的任务应该是每2秒重置一个值而不发生任何事情。
在此先感谢。
编辑:所以我建立了一个服务,但没有任何结果。 这是代码到:
public class SpmResetService extends Service {
@Override
public void onCreate() {
Log.v("spmService", System.currentTimeMillis() + "spmService has been created.");
}
@Override
public int onStartCommand(Intent intent, int flags, int startedId) {
Log.v("spmService", System.currentTimeMillis() + "spmService has been started.");
if((System.nanoTime() - startTime) > 2000000000) {
//my calculation
}
stopSelf();
return Service.START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
Log.v("spmService", System.currentTimeMillis() + "spmService has been bound.");
return null;
}
@Override
public void onDestroy() {
Log.v("spmService", System.currentTimeMillis() + "spmService has been destroyed.");
}
}
我然后在OnCreate开始像这样:
Intent spmReset = new Intent(this, SpmResetService.class);
startService(spmReset);
我还编辑了清单与
<service
android:name="SpmResetService"
>
</service>
但在这里它告诉我该服务的名称无法解析。
2个问题;您是否希望计算在完成一段不确定的时间后重复?计算的效果是否会影响UI? – RobVoisey
它应该始终运行一段不确定的时间。 – Lithimlin
现在它确实会影响UI,因此我可以看到它是否进行计算,但最终不需要 – Lithimlin