2016-04-22 58 views
1

我试图在应用程序中运行一些简单的计算,并且我希望它始终运行,即使应用程序不可见/活动。我查找了一些可能性,并最终使用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> 

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

+0

2个问题;您是否希望计算在完成一段不确定的时间后重复?计算的效果是否会影响UI? – RobVoisey

+0

它应该始终运行一段不确定的时间。 – Lithimlin

+0

现在它确实会影响UI,因此我可以看到它是否进行计算,但最终不需要 – Lithimlin

回答

0

首先你应该看看Services这是专门为此目的。

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

也可以在doInBackground方法中放置一条调试消息,以查看该任务是否正在执行。理想情况下,您应该使用调试器,但现在只需Log语句就可以了。

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; 
    } 

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

+0

谢谢,我已经尝试过设立服务了。 – Lithimlin

+0

好极了。让我知道是否有任何问题。 – g90

+0

我其实呢。它不工作。看起来服务从未被创建。 – Lithimlin

相关问题