1. Nimm jetzt an unserem AGM - Gewinnspiel teil - Informationen zum M1, A2 und A8 findest Du hier, hier und hier!
  1. snoofy, 09.09.2009 #1
    snoofy

    snoofy Threadstarter Neuer Benutzer

    Hallo zusammen,

    ich experimentiere derzeit mit Timern rum und bin auf folgendes Problem gestoßen. Wenn ich einem Timer über schedule einen auszuführenden Timertask zuweise, dann kann ich schedule nachdem dieser Timertask aufgerufen wurde nicht erneut mit diesem Timertask füttern. Hier mal ein kurzer Beispielcode:

    Code:
    import java.util.*;
    
    import android.app.Activity;
    import android.os.*;
    import android.widget.*;
    
    import android.util.*;
    
    public class test extends Activity {
        /** Called when the activity is first created. */    
        private ImageView blinker;
        
        private Timer blinkTimer = null;
        
        private Handler handler = new Handler();
    
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            
            blinker  = (ImageView) findViewById(R.id.blinker);
            
            blinkTimer = new Timer("gameTimer");
        }
    
        public void onResume() {
            super.onResume();
            blinken();
        }
        
        public void onPause() {
            blinkTimer.cancel();
            super.onPause();
        }
    
        TimerTask blinkTimerTask = new TimerTask() {
            public void run() {
                handler.post(new Runnable() {
                       
                       public void run() {   
                           blinken();
                       }
                });
            }
        };
        
        public void blinken() {
            if (blinker.getVisibility() == ImageView.INVISIBLE) {
                blinker.setVisibility(ImageView.VISIBLE);
            } else {
                blinker.setVisibility(ImageView.INVISIBLE);
            }
            blinkTimer.schedule(blinkTimerTask, 800);
        }
    }
    Das Programm stirbt immer in der Zeile "blinkTimer.schedule(blinkTimerTask, 800);", wenn blinken() vom handler aus aufgerufen wird.

    Irgend eine Idee?
     
  2. snoofy, 10.09.2009 #2
    snoofy

    snoofy Threadstarter Neuer Benutzer

    So, ich habe jetzt folgende Variante gewählt, wobei ich mir nicht wirklich sicher bin, das die alten TimerTasks wirklich ordentlich entfernt werden.

    Code:
        public void startBlinkerTimer(int delay) {
            blinkTimer.schedule(new TimerTask() {
                public void run() {
                    handler.post(new Runnable() {
                           
                           public void run() {   
                               blinken();
                           }
                    });
                }
            }, delay);
        }
    
        public void blinken() {
            if (blinker.getVisibility() == ImageView.INVISIBLE) {
                blinker.setVisibility(ImageView.VISIBLE);
            } else {
                blinker.setVisibility(ImageView.INVISIBLE);
            }
            
            startBlinkerTimer(1);
        }