2010-05-18 14 views
8

Używam poniższego kodu do planowania zadania w systemie Android, ale nie daje żadnych wyników. Proszę doradzić w tym samym.Zaplanuj zadanie w Androidzie

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

Dla tych, którzy chcą zaplanować rozpoczęcie/rozpoczęcie usługi/aktywności, zajrzyj do [AlarmManager] (http://developer.android.com/reference/android/app/AlarmManager.html) –

Odpowiedz

16

TimerTasks nie są idealne do wykorzystania w android środowiska, ponieważ nie jesteśmy świadomi kontekstu. Jeśli twój kontekst zniknie, TimerTask będzie nadal cierpliwie czekał w tle, w ostateczności strzelając i potencjalnie powodując awarię aplikacji, ponieważ jej działanie zostało wcześniej zakończone. Może też zawierać odniesienia do Twojej aktywności po jej zamknięciu, co zapobiega gromadzeniu śmieci i potencjalnemu wyczerpaniu pamięci.

Zamiast tego należy użyć funkcji postDelayed(), która automatycznie anuluje zadanie po zamknięciu działania.

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); 

Nawiasem mówiąc, jeśli kiedykolwiek potrzeba, aby anulować zadanie ręcznie, można użyć removeCallbacks(r) gdzie r jest runnable ty pisał wcześniej.

+0

Ten kod spowoduje wyciek pamięci –

4

Dostałem odpowiedź, jak na poniżej kodu:

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

Zadzwoń po 'postDelayed() 'na dowolnym' widoku'. Brak 'Timera', nie' TimerTask', bez dodatkowego wątku i bez potrzeby 'Handler'a'. – CommonsWare

+0

@CommonsWare Co zrobić, jeśli potrzebujesz czasomierza? – StarDust

+1

@StarDust: Wywołaj ponownie 'postDelayed()' w ramach pracy wykonywanej przez 'Runnable', które zaplanowałeś z pierwszym' postDelayed() ': https://github.com/commonsguy/cw-omnibus/tree/ master/Threads/PostDelayed – CommonsWare

Powiązane problemy