2012-07-15 10 views
6

Versuchen Sie eine Timer zu verwenden, um dies 4 Mal im Abstand von jeweils 10 Sekunden zu tun.So stoppen Sie einen Timer nach einer bestimmten Anzahl von Malen

Ich habe versucht, es mit einer Schleife zu stoppen, aber es stürzt ständig ab. Habe versucht, die schedule() mit drei Parametern zu verwenden, aber ich wusste nicht, wo eine Zählervariable zu implementieren ist. Irgendwelche Ideen?

final Handler handler = new Handler(); 
Timer timer2 = new Timer(); 

TimerTask testing = new TimerTask() { 
    public void run() { 
     handler.post(new Runnable() { 
      public void run() { 
       Toast.makeText(MainActivity.this, "test", 
        Toast.LENGTH_SHORT).show(); 

      } 
     }); 
    } 
}; 

int DELAY = 10000; 
for (int i = 0; i != 2 ;i++) { 
    timer2.schedule(testing, DELAY); 
    timer2.cancel(); 
    timer2.purge(); 
} 

Antwort

12
private final static int DELAY = 10000; 
private final Handler handler = new Handler(); 
private final Timer timer = new Timer(); 
private final TimerTask task = new TimerTask() { 
    private int counter = 0; 
    public void run() { 
     handler.post(new Runnable() { 
      public void run() { 
       Toast.makeText(MainActivity.this, "test", Toast.LENGTH_SHORT).show(); 
      } 
     }); 
     if(++counter == 4) { 
      timer.cancel(); 
     } 
    } 
}; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    timer.schedule(task, DELAY, DELAY); 
} 
+0

Danke, machte diese Antwort am meisten Sinn – jimmyC

+2

Kein Problem. Dann markieren Sie es als die richtige Antwort :) – Y2i

2

Warum einen nicht AsyncTask verwenden und nur hat es Thread.sleep (10000) und die publishProgress in einer while-Schleife? Hier ist, was es würde wie folgt aussehen:

new AsyncTask<Void, Void, Void>() { 

     @Override 
     protected Void doInBackground(Void... params) { 

      int i = 0; 
      while(i < 4) { 
       Thread.sleep(10000); 
       //Publish because onProgressUpdate runs on the UIThread 
       publishProgress(); 
       i++; 
      } 

      // TODO Auto-generated method stub 
      return null; 
     } 
     @Override 
     protected void onProgressUpdate(Void... values) { 
      super.onProgressUpdate(values); 
      //This is run on the UIThread and will actually Toast... Or update a View if you need it to! 
      Toast.makeText(MainActivity.this, "test", Toast.LENGTH_SHORT).show(); 
     } 

    }.execute(); 

Auch als eine Randnotiz, für längerfristige sich wiederholende Aufgaben, betrachten AlarmManager mit ...

1
for(int i = 0 ;i<4 ; i++){ 
    Runnable runnableforadd ; 
    Handler handlerforadd ; 
    handlerforadd = new Handler(); 
    runnableforadd = new Runnable() { 
     @Override 
     public void run() { 
      //Your Code Here 
      handlerforadd.postDelayed(runnableforadd, 10000);       } 
    }; 
    handlerforadd.postDelayed(runnableforadd, i); 

} 
Verwandte Themen