2017-01-20 9 views
0

Прежде всего, я новый для android. Поэтому я отображал текущее время на TextView в MainActivity.java с помощью обработчика , который работал отлично. Затем я использовал TimePicker (который фактически находится в другом действии TimeActivity.java), чтобы выбрать время, при котором время останавливается.Обработчик не обновляет UI

Например, если время выбрали с помощью TimePicker 8:30, время в TextView перестанут дальше продвинуться дальше 8.30

Также Theres кнопку STOP, с помощью которого вызывает handler.removeMessages (0);, чтобы остановить обработчик и, следовательно, время.

  • Проблема заключается в том, когда я вернусь из TimeActivity.java, то TextView пустой, который выглядит как обработчик не работают, но он успешно тосты «Время остановилось», когда хит времени вышло. Что это за аномалия?
  • я случайно столкнуться с другой проблемой, тостом, «Время остановилось» в конечного момента() преобладает на экране в течение аномально длительный периода времени, но это нормально с Тост в остановке (View об) даже если Я использовал ту же логику, чтобы остановить обработчик в обоих методах. Что вызывает это?

Вот мой MainActivity.java

import static com.gamecodeschool.broadcast.TimeActivity.minute1; 

общественного класса MainActivity расширяет AppCompatActivity {

Button start,stop,set; 
TextView textView; 
final Handler handler = new Handler(); 
Runnable r; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    //Views 
    textView = (TextView)findViewById(R.id.textView); 
    start = (Button)findViewById(R.id.button); 
    stop = (Button)findViewById(R.id.button2); 
    set = (Button)findViewById(R.id.button3); 

    set.setOnClickListener(new View.OnClickListener(){ 
     @Override 
     public void onClick(View v){ 
      Intent intent = new Intent(getApplicationContext(),TimeActivity.class); 
      startActivity(intent); 
     } 
    }); 
} 

public void stop(View v) { 
    handler.removeMessages(0); 
    Toast.makeText(this,"Stopped",Toast.LENGTH_SHORT).show(); 
} 

public void runInBackground(View v) { 
    handler.post(r); 
    r = new Runnable() { 
     @Override 
     public void run() { 
      //String time = java.text.DateFormat.getDateTimeInstance().format(new Date()); 
      Calendar calendar = Calendar.getInstance(); 
      int hour = calendar.get(Calendar.HOUR_OF_DAY); 
      int minute = calendar.get(Calendar.MINUTE); 
      StringBuilder stringBuilder = new StringBuilder().append(hour).append(":").append(minute); 
      textView.setText(stringBuilder); 
      if (minute==minute1){ 
       stopTime(); 
      } 
      handler.postDelayed(this,100); 
     } 
    }; 
} 

private void stopTime() { 
    handler.removeMessages(0); 
    Toast.makeText(this,"Time Stopped",Toast.LENGTH_SHORT).show(); 
} } 

И вот мой TimeActivity

public class TimeActivity extends AppCompatActivity { 

TimePicker timePicker; 
Button button; 
TextView textView; 
StringBuilder stringBuilder; 
static int hour1,minute1; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_time); 

    timePicker = (TimePicker)findViewById(R.id.timePicker); 
    button = (Button)findViewById(R.id.saveButton); 
    textView = (TextView)findViewById(R.id.timeView); 
    Calendar calendar = Calendar.getInstance(); 
    int hour = calendar.get(Calendar.HOUR_OF_DAY); 
    int minute = calendar.get(Calendar.MINUTE); 
    showTime(hour,minute); 
} 

private void showTime(int hour, int minute) { 
    stringBuilder = new StringBuilder().append(hour).append(":").append(minute); 
    textView.setText(stringBuilder); 
} 

public void saveTime(View v){ 
    hour1 = timePicker.getHour(); 
    minute1 = timePicker.getMinute(); 
    showTime(hour1,minute1); 
    Toast.makeText(TimeActivity.this,hour1+":"+minute1,Toast.LENGTH_SHORT).show(); 
    Intent intent = new Intent(this,MainActivity.class); 
    startActivity(intent); 
} } 

ответ

1

Обновление пользовательского интерфейса должно быть сделано на UIThread , например, для обновления вашего TextView Вы должны, например:

public void runInBackground(View v) { 
    handler.post(r); 
    r = new Runnable() { 
     @Override 
     public void run() { 
      //String time = java.text.DateFormat.getDateTimeInstance().format(new Date()); 
      Calendar calendar = Calendar.getInstance(); 
      int hour = calendar.get(Calendar.HOUR_OF_DAY); 
      int minute = calendar.get(Calendar.MINUTE); 
      StringBuilder stringBuilder = new StringBuilder().append(hour).append(":").append(minute); 
      runOnUiThread(new Runnable() { 
       @Override public void run() { 
        textView.setText(stringBuilder); 
       } 
      }); 
      textView.setText(stringBuilder); 
      if (minute==minute1){ 
       stopTime(); 
      } 
      handler.postDelayed(this,100); 
     } 
    }; 
} 
+0

Нет, его не работает. Та же проблема сохраняется. Любые другие исправления? Спасибо за помощь. – Vyshak