【问题标题】:Handler not updating UI处理程序不更新 UI
【发布时间】:2017-01-20 17:19:56
【问题描述】:

首先,我是安卓新手。所以我使用 Handler 在 MainActivity.java 中的 TextView 上显示当前时间,效果很好。然后我使用 TimePicker(实际上在另一个活动中,TimeActivity.java)来选择一个时间,在该时间停止。

例如,如果使用 TimePicker 选择的时间是 8:30,则 TextView 中的时间将停止超过 8:30

还有一个 STOP 按钮调用 handler.removeMessages(0); 来停止处理程序,从而停止时间。

  • 问题是,当我从 TimeActivity.java 回来时,TextView 是空白的,看起来 处理程序 没有运行,但它成功地祝酒“时间停止”当时间到了。这是什么异常?
  • 我碰巧遇到了另一个问题,Toast,stopTime() 中的“时间停止”在屏幕上的时间异常长,但 stop 中的 Toast 是正常的(查看 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);
} }

【问题讨论】:

    标签: java android android-handler


    【解决方案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);
            }
        };
    }
    

    【讨论】:

    • 不,它不起作用。同样的问题仍然存在。还有其他修复吗?不过感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    相关资源
    最近更新 更多