【问题标题】:does doInBackground of asynTask run in background?asyncTask 的 doInBackground 是否在后台运行?
【发布时间】:2013-11-08 09:23:38
【问题描述】:

我正在尝试创建一个倒数计时器,即使应用程序被发送到后台,它也会运行?我不确定如何使用服务来实现这一点,那么是否可以在 asyncTask 的 doBackground 方法中运行它,并且即使应用程序“最小化”,计时器也会继续运行吗?

感谢

【问题讨论】:

  • 没有。 AsyncTask 仍然绑定到上下文,因此如果您的上下文被杀死,它将取消。您需要使用服务。
  • 不用你做服务
  • 感谢回复,如何创建带有倒数计时器的服务?我只是希望服务一直运行并倒计时,但是一旦倒计时到期并调用 onDestroy() 方法,我该如何通知服务?
  • @user2042227 我相信这个问题得到了正确的回答,你不应该使用 cmets 来问第二个问题。老实说,第二个问题甚至不适用于 StackOverflow 标准。我建议您首先阅读并尝试自己实施服务。
  • 请查看this

标签: android android-asynctask countdowntimer


【解决方案1】:

doInBackgroud() 在不同的线程上运行。但这并不意味着它没有与应用程序绑定。如果应用停止,AsyncTask 停止。所以你的计时器在这里没有帮助。

您可以做的是,使用AlarmManager 调用BroadcastReceiver 表示计时器已到。这个BroadcastReceiver 可以反过来调用ServiceActivity,您可以在其中为所欲为。

【讨论】:

    【解决方案2】:

    如果你想使用 asynctask 运行倒数计时器,如果你想在 UI 上显示,你不能使用 doInBackground,因为它不能干预 UI。

    我认为你应该使用线程来解决这个问题。如果您希望/不希望计时器在应用程序最小化时继续运行,您可以使用布尔变量来控制(必须使用 runOnUiThread 来干预 UI

    使用方法:

        boolean stop=false;
        runOnUiThread(new Runnable() {
    
            @Override
            public void run() {
                // TODO Auto-generated method stub
                if (!stop) {
                    //YOUR CODE HERE
                }
            }
        });
    

    如果您想在应用最小化时停止计时器,可以在活动的onPause() 中设置stop=true

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

    如果您想在活动恢复时重新播放计时器,您可以在onResume()中设置stop=false

    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
        stop=false;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-04
      • 2020-10-24
      • 2012-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多