2011-11-12 43 views
0

我的問題與Android相關: 如何在intentservice中每20秒運行一次任務? 問題是,我必須初始化一些將在Handler「運行」過程中使用的類。 它工作一次 - 但然後服務停止&當處理程序循環在20秒後再次啓動時(可能是因爲服務停止時被刪除的類),應用程序會崩潰?所以也許解決方法是讓服務在Handler運行時保持運行,或丟棄代碼並正確執行它?Android - 如何在服務意圖(工作線程)中定期通過「處理程序」運行任務

希望有人能幫助我。

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. 2011年11月)

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

如果有一個崩潰,你需要發佈logcat。 – EboMike

回答

4

如何在intentservice中每20秒運行一次任務?

這不是IntentService的適當使用。請使用常規的Service

它的工作原理一個時間 - 但隨後該服務停止&應用程序崩潰時的處理程序環20秒

IntentService後重新開始關閉時onHandleIntent()的回報,這就是爲什麼這是打破了您。請使用常規的Service

另外:

  • 請允許用戶配置輪詢週期
  • 確保該服務將關機,當用戶不再希望它運行
相關問題