2016-04-22 23 views
1

私はアプリで簡単な計算を実行しようとしていて、Appが表示/非表示であっても常に実行したいと思っています。いくつかの可能性を調べて、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関数で実行入れてみました。

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でそれを開始しました:私は

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

しかし、ここでマニフェストをも編集した

Intent spmReset = new Intent(this, SpmResetService.class); 
    startService(spmReset); 

このサービスの名前を解決できないことがわかります。

+0

2件不定期に終了したら計算を繰り返すか?計算の効果は、とにかくUIに影響しますか? – RobVoisey

+0

常に不定期にaoを実行することになっています。 – Lithimlin

+0

現時点ではUIに影響を及ぼしているので、計算を行うかどうかを確認できますが、最後にはAsyncTasksが1回だけ実行され、2秒後にまだ実行されていないため、 – 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

関連する問題