Android 当活动处于焦点内或焦点外时处理异步任务完成
我有以下Android场景: “我的活动”启动异步任务以执行后台活动(Android 当活动处于焦点内或焦点外时处理异步任务完成,android,user-interface,android-asynctask,Android,User Interface,Android Asynctask,我有以下Android场景: “我的活动”启动异步任务以执行后台活动(AsyncTaskclass),然后搜索帐户。如果没有帐户,则在上一个AsyncTask仍在运行时,通过AbstractAuthenticator调用创建新帐户的UI 该任务最终将完成并在我之前活动的主线程上运行onPostExecute 我的问题如下:如果任务在我的活动处于顶部时完成,则会正确显示警报对话框;相反,如果任务在用户输入新帐户的用户名/密码时完成,则在尝试显示警报时,我会得到一个InvocationTargetE
AsyncTask
class),然后搜索帐户。如果没有帐户,则在上一个AsyncTask仍在运行时,通过AbstractAuthenticator
调用创建新帐户的UI
该任务最终将完成并在我之前活动的主线程上运行onPostExecute
我的问题如下:如果任务在我的活动处于顶部时完成,则会正确显示警报对话框
;相反,如果任务在用户输入新帐户的用户名/密码时完成,则在尝试显示警报时,我会得到一个InvocationTargetException
实际上,只有当活动处于活动状态时,才必须显示AlertDialog。我可以通过以下伪代码修改代码并利用onStart
方法:
public class MyActivity {
private boolean displayAlertOnStart = false;
protected void onStart(){
super.onStart();
if (displayAlertOnStart){
displayAlert();
displayAlertOnStart = false;
}
}
private void handleTaskCallback() {
if (activityIsOnTop()) //How do I get this???
displayAlert();
else
displayAlertOnStart = true;
}
我想通过编程知道当前活动是“在顶部”还是另一个活动是前台。这样,我将在下次运行onStart时执行我的逻辑
欢迎使用任何其他(和更简单的)解决方案。SDK 7
谢谢为什么不能在onStart()和onStop()方法中使用状态变量来维护活动的状态
public class MyActivity {
private boolean displayAlertOnStart = false;
private boolean activityInAStartedState = false;
protected void onStart(){
super.onStart();
activityInAStartedState = true;
if (displayAlertOnStart){
displayAlert();
displayAlertOnStart = false;
}
}
public void onStop(){
super.onStop();
activityInAStartedState = false;
}
private void handleTaskCallback() {
if (activityInAStartedState)
displayAlert();
else
displayAlertOnStart = true;
}
}
据我所知,没有任何方法可以让您知道活动是否可见 解决这个问题的一种方法是在应用程序类中保留一个变量,该变量表示此活动是否在顶部。要实现这一点,您需要在活动的
onPause()
和onResume()方法中管理它。使用静态getter和setter方法创建一个变量,类似于private boolean myActivityOnTop=false
。在onPause()
中,将此变量设置为false,并在onResume
中再次设置为true。然后用getter方法替换isActivityOnTop()
。如果您想知道多个活动中的哪一个位于顶部,可以做同样的事情,方法是将其设置为int、string或enum,并在调用任何活动的onResume
时进行设置
还有一个提示,每当一个活动被推到后台时,不能保证Android不会破坏它。您可以将
displayAlertOnStart
设置为true,但随后会销毁该活动。当它被带回到前端重新启动时,活动将被重新创建,并且不知道如何显示对话框。启动新活动后要维护的任何变量都应捆绑在onSaveInstanceState()
中,并在onCreate()
或onRestoreInstanceState()
中重新初始化。是的,我忘记了onStop方法的存在。我打算写下这个作为我自己的答案:)。关于“如何在焦点内或焦点外处理异步任务的完成”的问题仍有待进一步反馈。但我认为我们有一个赢家:)我认为这就是一切。另一件重要的事情是,取消onDestroy()方法中的AsyncTask,这样AsyncTask就不会在上下文死区对象中调用handleTaskCallback()。系统总是可以选择破坏您的活动:通过调用onDestroy()以有尊严的方式,或者以野蛮的方式,通过不这样做。如果它以野蛮的方式这样做,您将什么也做不了,虽然你会留下一个孤立的异步任务。虽然这种情况并不经常发生,但如果很关键的话,你需要考虑一下。我发现了一个很好的参考资料,它描述了当用户和操作系统创建、暂停和销毁活动时调用哪些方法。