Android - 如何在服务意图(工作线程)中定期通过“处理程序”运行任务

时间:2011-11-12 00:42:10

标签: android handler task intentservice

我的问题与Android有关: 如何在intentservice中每20秒运行一次任务? 问题是,我必须初始化一些将在Handler“run”过程中使用的类。 它工作一次 - 但随后服务停止&处理程序循环在20秒后再次启动时应用程序崩溃(可能是因为服务停止时被淘汰的类?)。因此,解决方案是,只要Handler运行或者丢弃代码并正确执行,服务就会保持运行状态?

希望,有人可以帮助我。

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

非常感谢你提前!!!

----所以这是现在更新的代码(14 nov.2011)

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

}

整个应用程序立即崩溃。

1 个答案:

答案 0 :(得分:4)

  

如何在intentservice中每20秒运行一次任务?

这不适合IntentService。请使用常规Service

  

它工作一次 - 但随后服务停止&处理程序循环在20秒后再次启动时应用程序崩溃

IntentService返回时,

onHandleIntent()会关闭,这就是为什么这会让你失望的原因。请使用常规Service

此外:

  • 请允许用户配置轮询周期
  • 确保在用户不再希望该服务运行时关闭此服务