2016-08-24 2 views
-1

Как установить таймер для TextView? Этот код продолжает разбивать мое приложениеКак установить таймер для textView? Это продолжает сбой моего приложения

final TextView textwel = (TextView) findViewById(R.id.welcometext); 
Thread timer = new Thread() { 
    public void run() { 
     try { 
      // this should sleep for 4 seconds 
      sleep(4000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

     textwel.setText("Welcome"); 
    } 
}; 

запустить таймер

timer.start(); 
+0

То плохой подход человека. Потому что это также приведет к исключению nullpointer, когда View будет уничтожен, а ваш фоновый поток снова вызовет View late. – Enzokie

+0

Используйте для этого обработчик. – Enzokie

ответ

0

Это не будет работать.

Поскольку новый поток, который вы создаете, не является потоком пользовательского интерфейса, вы не можете обновить интерфейс (задающий текст текстового вида) в этом потоке.

Лучшим способом для этого было бы использовать класс android.os.Handler. Он имеет метод postDelayed, который будет выполнять Runnable с задержкой. Here - это документы.

В качестве альтернативы, вы можете использовать этот Timer класс, который я написал, что инкапсулирует Handler экземпляр и имеет простой интерфейс:

import android.os.Handler; 

public class Timer { 
    private Handler handler; 
    private boolean paused; 

    private int interval; 

    private Runnable task = new Runnable() { 
     @Override 
     public void run() { 
      if (!paused) { 
       runnable.run(); 
       Timer.this.handler.postDelayed (this, interval); 
      } 
     } 
    }; 

    private Runnable runnable; 

    public int getInterval() { 
     return interval; 
    } 

    public void setInterval(int interval) { 
     this.interval = interval; 
    } 

    public void startTimer() { 
     paused = false; 
     handler.postDelayed (task, interval); 
    } 

    public void stopTimer() { 
     paused = true; 
    } 

    public Timer (Runnable runnable, int interval, boolean started) { 
     handler = new Handler(); 
     this.runnable = runnable; 
     this.interval = interval; 
     if (started) 
      startTimer(); 
    } 
} 

Gist

Вы, вероятно, использовать его как это:

Runnable run = new Runnable() { 
    public void run() { 
     textwel.setText("Welcome"); 
    } 
}; 
Timer timer = new Timer(run, 4000, true); 

PS установка текста текста в «Добро пожаловать» каждые 4 секунды бессмысленна.

-1

попробовать это, он будет работать на 100%, а также пользовательский интерфейс не будет застрял

Thread timer = new Thread() { 
    public void run() { 
     try { 
      // this should sleep for 4 seconds 
      sleep(4000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
// after sleep call a UI thread 
     runOnUiThread(new Runnable() { 

         @Override 
         public void run() { 
          textwel.setText("Welcome"); 
         } 
        }); 
    } 
}; 
0

Вы можете использовать CountDownTimer API для обновления TextView таймера, который очень прост в использовании и удобно.

Вот простой пример:

TextView tvTime = (TextView)findViewById(R.id.tv_time); 
CountDownTimer countDownTimer = new CountDownTimer((durationInMilis * 60000), 1000) { 
     @Override 
     public void onTick(long millisUntilFinished) 
     { 
      String hms = String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millisUntilFinished), 
        TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millisUntilFinished)), 
        TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished))); 
      tvTime.setText(hms); 
     } 

     @Override 
     public void onFinish() 
     { 
      // Do your other task on finish 
     } 
    }.start(); 

Этот код это обновит Tvtime тексту каждый второй и работать на sepecified количество времени в durationInMilis. Выход будет выглядеть как hh: mm: ss, например, 01:23:57

Если вы ничего не хотите показывать в обновлении, оставьте обратный вызов onTick() пустым и обновите TextView в onFinish(). Просто передайте значение параметру durationInMilis, для которого вы хотите запустить таймер.

Если у вас есть какие-либо сомнения, не стесняйтесь комментировать.

0

Почему вы используете textview ??

Хронометр - это класс, предоставляемый андроидом, который реализует простой таймер, поэтому мое предложение использует его вместо textview.

вот official link

0

// использовать его, его легко и просто

new Handler().postDelayed(new Runnable() { 
     @Override 
     public void run() { 

      textwel.setText("Welcome"); 
     } 

    }, 4000);