java - Android中周期性任务的实现

标签 java android timer android-activity timertask

我想创建一个小型Android应用程序,它会在单击按钮后定期显示系统时间(即设置 Activity )...用于按钮创建和通过Intent设置定期 Activity 的代码是这样的:

package com.example.timeupdate;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

Button button;
TextView show;

@Override
protected void onCreate(Bundle I_Love_Biriyani) {
    super.onCreate(I_Love_Biriyani);
    setContentView(R.layout.activity_main);

    button = (Button) findViewById (R.id.pressButton);
    show = (TextView) findViewById (R.id.Show);

    button.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub

            Intent openTimeUpdater = new Intent("com.example.timeupdate.TIMEUPDATER");
            startActivity(openTimeUpdater);

        }
    });

}


@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    finish();
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}



}

这是重复计时器的代码(例如 5 秒),我使用 TimerTask 类来执行该作业:

package com.example.timeupdate;

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class TimeUpdater extends Activity {

    TextView Show;

    TimerTask timer= new TimerTask(){

        @Override
        public void run() {
            // TODO Auto-generated method stub
            Date d = new Date();
            Show.setText(""+d);
        }

    };

    @Override
    protected void onCreate(Bundle hotovaga) throws IllegalStateException {
        // TODO Auto-generated method stub
        super.onCreate(hotovaga);
        setContentView(R.layout.new_update);

        Show = (TextView) findViewById (R.id.time);

        Timer t = new Timer();
        t.scheduleAtFixedRate(timer , 0 , 5000);

    }


}

单击按钮后,时间仅显示一次,然后应用程序将停止显示对话框消息。需要解释才能以同样的方式完成这项工作。

最佳答案

您正在尝试访问非 UI 线程内的 UI 元素。

Show.setText(""+d);

相反,将其包装在 runOnUiThread 接口(interface)中以获得正确的输出。

在您的 TimeUpdater 类中使用以下代码

public class TimeUpdater extends Activity {


    TextView Show = null;
    Calendar c; 
    int seconds;
    int minutes;
    int hours;

    TimerTask timer= new TimerTask(){

        @Override
        public void run() {
            c = Calendar.getInstance();
            seconds = c.get(Calendar.SECOND);
            minutes = c.get(Calendar.MINUTE);
            hours = c.get(Calendar.HOUR);

            runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    Show.setText(hours + ":" + minutes + ":" + seconds);
                }
            });
        }

    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.new_update);

        Show = (TextView) findViewById (R.id.time);

        Timer t = new Timer();
        t.scheduleAtFixedRate(timer , 0 , 5000);


    }

}

关于java - Android中周期性任务的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19493243/

相关文章:

java - 无法解析符号 'LastModifiedFileComparator'

android - 如何将 Order By 参数传递给 Room @Query?

java - 使用上下文菜单从 Android 中的 SQLite 数据库中删除

c# - 定时器不会以多线程形式触发

java - 如何按顺序随机播放图像?

java - PrintWriter 类的反面是什么?

java - 类型不匹配 : cannot convert from Optional<Object> to BasketDTO

c++ - 如何找到 setitimer() 的分辨率?

java - 更改默认的照片选择器 Intent 文本?

java - 如何在android中显示警报时检测搜索按钮