2017-01-20 2 views
0

Zunächst einmal, ich bin neu auf Android. So wurde ich die aktuelle Zeit auf einem TextView in der MainActivity.java mit einem Handler angezeigt, die gut funktioniert. Dann benutzte ich einen TimePicker (der sich eigentlich in einer anderen Aktivität befindet, TimeActivity.java), um eine Zeit auszuwählen, zu der die Zeit aufhört.Handler nicht update UI

Zum Beispiel, wenn die Zeit unter Verwendung nimmt die Timepicker 8.30 sind, wird die Zeit in Textview nicht mehr weiter voran über 8:30

Theres auch eine STOP-Taste, mit der handler.removeMessages ruft (0);, um den Handler und damit die Zeit zu stoppen.

  • Das Problem ist, wenn ich von TimeActivity.java zurückkommen, die Textview ist leer, die wie die Handler sieht läuft nicht, aber es röstet erfolgreich „die Zeit stehen geblieben“, wenn die Treffer Zeit. Was ist diese Anomalie?
  • ich zufällig ein anderes Problem zu begegnen, der Toast, „Die Zeit steht still“ in Stoptime() für eine ungewöhnlich längere Zeit auf den Bildschirm herrscht, aber es ist mit dem Toast in Anschlag (Blick v) normale obwohl Ich habe die gleiche Logik verwendet, um den Handler in beiden Methoden zu stoppen. Was verursacht das?

Hier ist mein MainActivity.java

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

public class MainActivity AppCompatActivity erstreckt {

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

Und hier mein 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); 
} } 

Antwort

1

UI Update muss auf dem UIThread erfolgen zum Beispiel um deine 012 zu aktualisierensollten Sie zum Beispiel:

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

Nein, es funktioniert nicht. Das gleiche Problem besteht fort. Irgendwelche anderen Korrekturen? Danke für die Hilfe. – Vyshak