Search code examples
androidandroid-serviceandroid-alarms

Error Thread already started / scheduled


Friends,

I set up an AlarmManager within my application. The AlarmManager is scheduled to start a background Service every xx , here 1 Min. Its working quite well for a while. But freuqently I get an Error: thead already started / scheduled. I have the feeling that i might dont use destructors correct. Would be grateful for your support.

Heres my code of the Activity that starts the AlarmManager

    PendingIntent pi;
    AlarmManager mgr;
    mgr=(AlarmManager)ctx.getSystemService(Context.ALARM_SERVICE);

    Intent i=new Intent(DataCollectionActivity.this, HUJIDataCollectionService.class);

     pi = PendingIntent.getService(DataCollectionActivity.this, 0, i, 0);
         ........  
    if (viewId == R.id.b_startService) {


        mgr.cancel(pi);

        mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() , 1* 60* 1000, pi);}

            ........
    if (viewId == R.id.b_stopService) {


        mgr.cancel(pi);}

and heres the important code of my Service:

                      private Runnable LocationUpdateTimerTask = new Runnable() {
    public void run() {
        Log.i(ctx.getString(R.string.app_name),
                "HUJIDataCollectionService, 1 LocationUpdateTimerTask, start");
        setuplistenerandrequestupdates();
        mHandler.removeCallbacks(LocationUpdateTimerTask);

    }
};


            private Runnable SendDataStopLocationUpdatesTimerTask = new Runnable() {
    public void run() {

        sendDataToServer();



        mHandler.removeCallbacks(SendDataStopLocationUpdatesTimerTask);

        ServiceIntervalTimerTask.cancel();
        Intent service = new Intent(ctx, HUJIDataCollectionService.class);
        stopService(service);

    }
};


            private TimerTask ServiceIntervalTimerTask = new TimerTask() {
    @Override
    public void run() {


        // remove old timer updates
        mHandler.removeCallbacks(LocationUpdateTimerTask);
        mHandler.removeCallbacks(SendDataStopLocationUpdatesTimerTask);
        // Start TimerTasks delayed
        mHandler.postDelayed(LocationUpdateTimerTask, 1000);
        mHandler.postDelayed(SendDataStopLocationUpdatesTimerTask,
                conf_LocationUpdatePeriodInSec * 1000);


    }

};


            @Override
public void onDestroy() {
    super.onDestroy();



    startDataCollectionServiceIntervallTimer.cancel();

    startDataCollectionServiceIntervallTimer = null;
    // Remove all kinds of updates
    mHandler.removeCallbacks(LocationUpdateTimerTask);
    mHandler.removeCallbacks(SendDataStopLocationUpdatesTimerTask);


}


             @Override
public int onStartCommand(Intent intent, int flags, int startId) {



    startDataCollectionServiceIntervallTimer = new Timer(
            "HUJIDataCollectionServiceStartTimer");

    startDataCollectionServiceIntervallTimer.schedule(ServiceIntervalTimerTask,
            1000L, conf_sampleTimeInMin * 60 * 1000L);

    mHandler = new Handler();

    return START_STICKY;
}

Solution

  • I think i found the solution for the problem my own. First i bypassed the problem by starting a Broadcastreceiver. But this is not an answer to the described problem.

    Here is a solution:

                     public void pause(){           
    
    
            while(true){    
    
                try {                           // goes through this thread until our thread died
                    ourthread.join();        //Blocks the current Thread (Thread.currentThread()) until the receiver finishes its execution and dies.
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }   
                break;
            }
    

    Thanks for the support anyways!!! Cheers