【问题标题】:Android don't call onPause and onStop when looping process is running循环进程运行时,Android 不调用 onPause 和 onStop
【发布时间】:2015-12-31 04:02:29
【问题描述】:

我创建了一个非常简单的 android 应用程序,其中一个按钮名称是“生成”。 Activity 处理 onclick 事件。

public void autoGenerate(View view) throws InterruptedException {
    Log.v("Hello", "I'm Duy");
    final int count = 10000;
    for (int i = 0; i < count; i++) {
        Log.v("Count", String.valueOf(i));
        Thread.sleep(1000);
    }
}

我已将日志添加到 onPause 和 onStop。

@Override
protected void onPause() {
    Log.v("Life Cycle", "onPause ...");
    super.onPause();
}

@Override
protected void onStop() {
    Log.v("Life Cycle", "onStop ...");
    super.onStop();
}

我点击生成按钮,这个应用程序打印 LogCat 中的计数器值。然后我点击手机上的主页按钮,在循环完成之前没有发生回调。我完全不明白这种情况,因为我认为当应用程序消失时,系统应该调用回调 onPause 和 onStop。

谁能帮帮我?我只是一个开始阅读android电子书的初学者。

【问题讨论】:

  • 你几乎不应该在主线程上调用Thread.sleep();。曾经。正如您现在已经注意到的那样,它会中断 Activity 的生命周期方法。
  • 我怀疑没有回调 (Thread.sleep(1000);) 使线程休眠 1 秒 X 10000 = 2.778 小时

标签: java android lifecycle


【解决方案1】:

一旦您进入一个循环,应用程序将不会退出,直到您的循环完成。与其直接使用循环,不如启动一个新线程来执行循环。即使关闭应用程序,循环也会在后台运行。

【讨论】:

  • 我明白了。所以,onclick事件处理我的点击很久了,回调函数应该和循环在同一个线程,是一个UI线程。系统需要等待主线程完成循环。这就是为什么这里没有发生回调。我不应该再将 UI 线程用于需要很长时间的任务。
  • @DuyNguyenThanh 是的,你必须使用 runOnUiThread() 并创建一个新线程来执行循环或任何其他操作
  • @DuyNguyenThanh 如果有帮助,请接受我的回答
【解决方案2】:

UI 点击事件是从应用程序的主线程处理的。 您的 for 循环阻塞了主线程,因此 onPause 生命周期调用被延迟。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-17
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多