Java 在android中定期运行异步任务

Java 在android中定期运行异步任务,java,android,multithreading,Java,Android,Multithreading,我想每1秒运行一个异步任务,每1秒更新一次屏幕。 怎样才能做到呢 举个简单的例子,我想每1秒显示一次当前时间。 我创建了一个异步任务,它可以计算当前时间并更新UI一次。 任务如何无限地运行 您可以使用定时器和定时器任务 文档建议使用ScheduledThreadPoolExecutor,但计时器非常简单,仍然值得考虑。异步任务的设计不允许重复运行。这是一次性的。你开枪,处理这些东西,然后忘记它。对于重复工作,请尝试: 调度线程池执行器 定时器任务 报警管理器 这两种方法都可以为您完成任务

我想每1秒运行一个异步任务,每1秒更新一次屏幕。
怎样才能做到呢

举个简单的例子,我想每1秒显示一次当前时间。
我创建了一个异步任务,它可以计算当前时间并更新UI一次。

任务如何无限地运行

您可以使用
定时器
定时器任务


  • 文档建议使用
    ScheduledThreadPoolExecutor
    ,但
    计时器非常简单,仍然值得考虑。

    异步任务的设计不允许重复运行。这是一次性的。你开枪,处理这些东西,然后忘记它。对于重复工作,请尝试:

    • 调度线程池执行器
    • 定时器任务
    • 报警管理器
    这两种方法都可以为您完成任务。

    按如下方式编写代码:

    public class MainActivity extends Activity {
    
    TextView mClock;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        mClock = (TextView) findViewById(R.id.your_textview_id);
    }
    
    private Handler mHandler = new Handler();
    private Runnable timerTask = new Runnable() {
        @Override
        public void run() {
            Calendar now = Calendar.getInstance();
            mClock.setText(String.format("%02d:%02d:%02d",
                    now.get(Calendar.HOUR),
                    now.get(Calendar.MINUTE),
                    now.get(Calendar.SECOND)) );
            mHandler.postDelayed(timerTask,1000);
        }
    };
    
    @Override
    public void onResume() {
        super.onResume();
        mHandler.post(timerTask);
    }
    
    @Override
    public void onPause() {
        super.onPause();
        mHandler.removeCallbacks(timerTask);
    }
    }
    

    所有这些答案都是错误的。如果你想在另一个线程上发生一些事情,定期使用一个奇怪的线程。在顶部放置一个while循环,并使其休眠到下次运行。

    使用
    ScheduledThreadPoolExecutor
    :我认为每秒启动一个新线程是无效的。@kusef-线程池的要点是,您不会每次都启动一个新线程,不过,还是希望能重复使用一个小数字。这是对OP的评论:)感谢重播解决了这个问题。作者希望每1秒更新一次GUI,这样GUI线程中就必须发生“某些事情”。作者以这个为例。他最初说AsyncTask,这意味着他想在另一个线程中做一些事情。如果这不是他想要的,他应该澄清。例如,如果他想访问一个网站并发布结果,他必须使用线程或AsyncTask(这里AsyncTask是错误的解决方案),然后通过处理程序将UI更改发布回UI线程。同意如果他在另一个线程上不需要它,那么线程不是正确的解决方案。