Android - サービスインテント(ワーカースレッド)内で定期的に "ハンドラ"経由でタスクを実行する方法

My question is Android related: How do I run a task every 20 seconds within an intentservice ? Problem is, I have to init some classes which will be used in the Handler "run" process. It works one time - but then the service stops & the application crashes when the handler-loop starts again after 20 seconds (probably because of the classes that got eliminated when the service stopped?). So maybe the solution is to get the service to stay running as long as the Handler runs or to throw away the code and do it right ?

希望、誰かが私を助けることができます。

public class Fadenzieher extends IntentService{

 private Handler handler = new Handler();

 private Runnable timedTask = new Runnable(){

      @Override
      public void run() {

   //My functions get called here... 
           //class1member.getDBWorkdone(); 

       handler.postDelayed(timedTask, 20000); 
       handler.obtainMessage();

      }};

public Fadenzieher() {
    super("Fadenzieher");

}

@Override
  protected void onHandleIntent(Intent intent) {

   //SOME INITIALISING
   //I have to init some vars & functions here that 
           //will also be used inside the handler loop
           //Class1 class1member = new Class1();
   //class1member.startUpDB();

          handler.post(timedTask); }

事前にどうもありがとうございました!!!

----これは今更新されたコードです(2011年11月14日)

public class Fadenzieher extends Service{
  private static final long UPDATE_INTERVAL = 60000;
Context context = this;
private Timer timer = new Timer();
DbHelper dbHelper;

public void onCreate(){
dbHelper = new DbHelper(context);
runTheLoop();
}

 protected void runTheLoop() {

    timer.scheduleAtFixedRate(new TimerTask(){
        @Override
        public void run() {

        dbHelper.dosomethings();
        Toast.makeText(context, "CALL", Toast.LENGTH_LONG).show();
        }}, 0, UPDATE_INTERVAL);

  }

@Override   
public int onStartCommand(Intent intent, int flags, int startId) {
    Toast.makeText(this, "Starte Service“, Toast.LENGTH_SHORT).show();

   return super.onStartCommand(intent,flags,startId);
}

public void onDestroy() {
    super.onDestroy();
    dbHelper.close();
    Toast.makeText(this, "Stoppe Service“, Toast.LENGTH_LONG).show();

}

// We return the binder class upon a call of bindService
@Override
public IBinder onBind(Intent arg0) {
    return mBinder;
}

public class MyBinder extends Binder {
    Fadenzieher getService() {
        return Fadenzieher.this;
    }
}

}

すぐにアプリケーション全体がクラッシュします。

0
クラッシュした場合は、logcatを投稿する必要があります。
追加された 著者 EboMike,

1 答え

インテントサービス内で20秒ごとにタスクを実行するにはどうすればよいですか?

これは IntentService の適切な使用ではありません。通常のサービスを使用してください。

It works one time - but then the service stops & the application crashes when the handler-loop starts again after 20 seconds

IntentService shuts down when onHandleIntent() returns, which is why this is breaking for you. Use a regular Service, please.

また、

  • ユーザーがポーリング期間を設定できるようにしてください
  • このサービスが停止していることを確認します。
4
追加された