2010-05-18 12 views
8

Ich verwende unten Code für die Planung einer Aufgabe in Android, aber es gibt keine Ergebnisse. Bitte geben Sie gleich an.Aufgabe in Android planen

int delay = 5000; // delay for 5 sec. 
int period = 1000; // repeat every sec. 
Timer timer = new Timer(); 
timer.scheduleAtFixedRate(new TimerTask() { 

    public void run() { 
     Toast.makeText(getApplicationContext(),"RUN!",Toast.LENGTH_SHORT).show(); 
    } 

}, delay, period); 
+0

Für diejenigen, die Service/Aktivität starten oder Broadcast planen möchten, werfen Sie einen Blick auf [AlarmManager] (http://developer.android.com/reference/android/app/AlarmManager.html) –

Antwort

16

TimerTasks nicht ideal ist in einer Android-Umgebung zu verwenden, weil sie nicht kontext bewusst sind. Wenn Ihr Kontext sich verflüchtigt, wartet die TimerTask immer noch geduldig im Hintergrund und feuert möglicherweise Ihre App ab, weil ihre Aktivität zuvor beendet wurde. Es kann auch Referenzen zu Ihrer Aktivität enthalten, nachdem diese geschlossen wurde. Dadurch wird verhindert, dass sie als Garbage Collected erfasst werden und Ihre App möglicherweise nicht mehr genügend Arbeitsspeicher zur Verfügung hat.

Verwenden Sie stattdessen postDelayed(), wodurch die Aufgabe automatisch beendet wird, wenn die Aktivität heruntergefahren wird.

final int delay = 5000; 
final int period = 1000; 
final Runnable r = new Runnable() { 
    public void run() { 
     Toast.makeText(getApplicationContext(),"RUN!",Toast.LENGTH_SHORT).show(); 
     postDelayed(this, period); 
    } 
}; 

postDelayed(r, delay); 

By the way, wenn Sie jemals Ihre Aufgabe manuell stornieren müssen, können Sie removeCallbacks(r) verwenden, wo r die runnable zuvor geschrieben ist.

+0

Dieser Code verursacht Speicherverlust –

4

Ich bekam die Antwort nach unten Code:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    Timer timer = new Timer(); 

    timer.schedule(new ScheduledTaskWithHandeler(), 5000); 

} 

final Handler handler = new Handler() { 

    public void handleMessage(Message msg) { 
     Toast.makeText(getApplicationContext(), "Run!", 
      Toast.LENGTH_SHORT).show(); 
    } 
}; 

class ScheduledTaskWithHandeler extends TimerTask { 

    @Override 
    public void run() { 
     handler.sendEmptyMessage(0); 
    } 
} 
+3

Bitte rufen Sie einfach 'postDelayed() 'auf einer' Ansicht'. Kein 'Timer', kein' TimerTask', kein zusätzlicher Thread und kein 'Handler'. – CommonsWare

+0

@CommonsWare Was ist, wenn Sie einen Wiederholungstimer brauchen? – StarDust

+1

@StarDust: Rufen Sie 'postDelayed()' erneut auf, als Teil der Arbeit, die von 'Runnable' erledigt wurde, die Sie mit dem ersten' postDelayed() 'terminiert haben: https://github.com/commonsguy/cw-omnibus/tree/ Master/Threads/PostDelayed – CommonsWare

Verwandte Themen