2013-11-25 2 views
0

У меня есть простая основная активность, которая содержит поток для обновления времени и отображения его в пользовательском интерфейсе. Вот оно:Темы продолжаются, когда активность перезапускается

 final Runnable runnableTime = new Runnable() { 
     @Override 
     public void run() { 
      { 
       Date d = new Date(); 
       CharSequence timeString = DateFormat.format(
         "hh: mm: ss -- d/MM/yyyy ", d.getTime()); 
       infoEntries.get(0).setDetails((String) timeString); 
       c2_adapter.notifyDataSetChanged(); 
       System.out.println(timeString); 
       handler.postDelayed(this, 1000); 
      } 
     } 
    }; 
    handler.post(runnableTime); 

Теперь моя проблема заключается в том, что, когда я перезагружать деятельность с помощью этого метода:

public void restart() { 
    finish(); 
    startActivity(getIntent()); 
} 

Активность перезагружается просто отлично, но я теперь 2 из тех же нитей, работает в фон и время больше не обновляется в пользовательском интерфейсе.

Я попытался создать свой собственный Runnable, который расширяет Runnable для меня, чтобы иметь возможность завершить runnable при перезапуске. Но это вызвало больше проблем.

Ive перекрываться эти методы в этой моде:

public void restart() { 
    finish(); 
    startActivity(getIntent()); 
} 

@Override 
public void onResume(){ 
    super.onResume(); 
    handler.post(runnableTime); 
} 

@Override 
public void onPause(){ 
    super.onPause(); 
    handler.removeCallbacks(null); 
} 

Вот время элемент, который вызывается в методе по созданию, а также внутри Teh таймера ^:

 Date d = new Date(); 
    CharSequence timeString = DateFormat.format("hh: mm: ss -- d/MM/yyyy ", 
      d.getTime()); 

    infoEntries.add(new ConsoleItem((String) timeString)); 

Кто-нибудь есть решение для этого?

Заранее спасибо за ваше время :)

ответ

0

время не обновляется в пользовательском интерфейсе, потому что вы потеряли ссылку на интерфейс. Также будет лучше сделать цикл while со сном() внутри метода run, чтобы обработать время и выйти из цикла while в действие onPause(). Как, например это может быть

boolean running = false; 
    while (running) { 
     // TODO do your stuff 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 

до того, чтобы начать подсчет вызова

running=true; 

и в деятельности OnPause()

running=false; 

таким образом, вы будете обрабатывать, когда для запуска работоспособной, и он будет stop on activity pause/

+0

Это выглядит намного чище и понятнее. Но я не уверен, как реализовать паузу. Потому что он все еще не обновляет его правильно. Теперь время не обновляется. –

+0

У вас есть ListView или что-то вроде этого? в вашей деятельности вам нужно переопределить метод onPause() класса Activity, просто добавьте строку running = false сразу после super.onPause(). – Eddy

+0

Да Время находится внутри списка. –

0

Во-первых, у вас нет никаких потоков (только поток пользовательского интерфейса). Во-вторых, если вы начинаете что-то, вы должны его где-то остановить.

Итак, переместите этот handler.post(runnableTime); в метод ActivityResume для Activity и добавьте handler.removeCallbacks(runnableTime); в метод Activity on Pause.

+0

Я понимаю, что вы имеете в виду. Iv'e добавил два метода: OnPause и on create, но я не могу: handler.remove, он дает мне ошибку и просит его разобрать его (пакет). –

+0

Я сделал опечатку), это должно быть removeCallbacks) – Leonidos

+0

Я переместил его в метод onResume, но теперь он вообще не запускается:/Ill обновить вопрос. –

0

Согласно @blackbelt ответ

в вашей деятельности переопределить метод OnPause

@override 
public void onPause() 
{ 
    handler.removeCallbacks(runnableTime); 
} 
Смежные вопросы