2017-01-20 72 views
0

首先,我新來android。因此,我使用Handler在MainActivity.java中的TextView上顯示當前時間,這很好。然後我使用TimePicker(實際上是在另一個活動TimeActivity.java中)選擇時間停止的時間。處理程序不更新UI

例如,如果時間使用TimePicker是8:30拾取,在TextView的時間將不再進一步推進超出8:30

而且那裏有與它調用handler.removeMessages一個STOP按鈕(0);停止處理程序,因此時間。

  • 的問題是,當我來自TimeActivity.java回來,TextView的是空白的,看起來像處理未運行,但它成功乾杯「時間停止」到時候的命中。這是什麼異常?
  • 我碰巧遇到了另一個問題,麪包,在停止時間()普遍存在的屏幕時異常較長的時間上,但它是正常的與土司停止(視圖V)儘管「時間停止」我用同樣的邏輯在兩種方法中停止處理程序。這是什麼造成的?

這裏是我的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

更新UI必須在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