【问题标题】:Why is finish() not quitting processing immediately?为什么完成()不立即退出处理?
【发布时间】:2011-12-30 12:07:40
【问题描述】:

在调用finish()后不立即退出Activity是否方便?

(换句话说,为什么这个方法没有立即从设计中退出活动?)

http://developer.android.com/reference/android/app/Activity.html#finish()

更新

当我说立即时,我的意思是,您将及时调用 finish(),当然,使用保存实例包进行清理、onStop 和 onDestroy 方法不算在内。

看一个例子我在说什么,这里是sn-p

onCreate(Bundle savedInstance){
    // code executed
    if(somecondition){
        finish();
    }
    // code which shouldn't be executed
}

问题是,为什么条件之后的代码在结束活动之前也完成了,为什么finish() 调用没有立即停止处理

【问题讨论】:

  • 立即是什么意思?
  • 它当然是设计使然 - 当您调用 Activity#finish() 时,Activity 遵循其生命周期,暂停、停止和销毁您的活动 - 除非您在之后清理您自己仍然可以在其他线程中运行垃圾或将内容发回 UI 线程。
  • @Flo 我的意思是在调用此方法后立即跳过当前进程块中的其余代码
  • @Jens 我明白这一点,请查看我的问题的更新,看看我在说什么
  • 嗯,是的,但是finish() 不像普通 Java 中的 System#exit(int) - 它只通知 Android 当前活动应该结束并退出 - 让它做你想做的事将不得不抛出异常或杀死虚拟机——这都是令人讨厌且毫无意义的事情。

标签: java android activity-finish


【解决方案1】:

你不应该做一个返回来阻止下面的代码执行吗:

if(somecondition){
    finish();
    return;
}

【讨论】:

  • 好建议,我已经这样做了。问题是关于why do we have to do it like this 而不是how can we avoid executing rest of function code。不过还是谢谢
  • 这就是 Java 的本质。您只能通过返回、方法块结束或抛出异常来停止执行。如果你想避免返回,也许你可以添加 else 块 if(somecondition){ finish(); } 其他 { }
【解决方案2】:

假设您有一个 thread_0,其中有一个循环处理所有事件。

调用finish 会添加一个新事件,但在thread_0 处理该事件之前,该活动不会被终止。

【讨论】:

  • 好吧,你说,调用finish()是如何将你的活动标记为ready-to-be-killed/finished而不是立即触发完成代码的方式?
【解决方案3】:

需要检查:您是否正在运行任何未完成的异步任务?

【讨论】:

  • 不,调用finish() 时的任何异步任务已经在运行
【解决方案4】:

finish() 只是隐藏活动,但不会立即终止。 当操作系统需要一些内存来运行其他应用程序或进程时,它可以被杀死。

【讨论】:

  • 我想,你在这里描述的是暂停活动的行为,不是吗?
【解决方案5】:

我猜Android 允许你在finish() 之后保存一些数据。我认为取消也可能会伤害线程。在您的情况下,您可以使用 return;停止代码执行。

【讨论】:

    猜你喜欢
    • 2015-03-28
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    • 2022-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多