0

私の質問はAndroidに関連しています:intentservice内で20秒ごとにタスクを実行するにはどうすればよいですか?問題は、ハンドラーの「実行」プロセスで使用されるいくつかのクラスを初期化する必要があることです。1回だけ動作しますが、20秒後にハンドラーループが再開すると、サービスが停止し、アプリケーションがクラッシュします(おそらく、サービスの停止時にクラスが削除されたためですか?)。したがって、解決策は、ハンドラーが実行されている限りサービスを実行し続けること、またはコードを破棄して正しく実行することです。

誰かが私を助けてくれることを願っています。

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

}

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

4

1 に答える 1

4

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

それは の適切な使用法ではありませんIntentService。正規品をご利用Serviceください。

一度は機能しますが、20秒後にハンドラーループが再び開始すると、サービスが停止し、アプリケーションがクラッシュします

IntentService戻るとシャットダウンするonHandleIntent()ため、これが壊れています。正規品をご利用Serviceください。

また:

  • ユーザーがポーリング期間を構成できるようにしてください
  • ユーザーが不要になったときにこのサービスがシャットダウンされるようにします。
于 2011-11-12T12:29:32.563 に答える