当Activity处于焦点或焦点时处理异步任务

时间:2012-05-04 16:39:33

标签: android user-interface android-asynctask

我有以下Android方案:

我的活动启动异步任务以执行后台活动(AsyncTask类),然后搜索帐户。如果没有帐户,则在前一个AsyncTask仍在运行时,通过AbstractAuthenticator调用创建新帐户的UI。

该任务最终将完成并在我之前活动的主线程上运行onPostExecute。

我的问题如下:如果任务在我的活动位于顶部时完成,则会正确显示AlertDialog;相反,如果在用户输入新帐户的用户名/密码时任务完成,我在尝试显示警报时会收到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。

谢谢

2 个答案:

答案 0 :(得分:1)

为什么不能在onStart()和onStop()方法中使用状态变量来维护Activity的状态?

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;
      }    
}

答案 1 :(得分:0)

据我所知,没有方法可以让您知道活动是否可见。

解决此问题的一种方法是在Application类中保留一个变量,表示此Activity是否位于顶部。要实现此功能,您需要在Activity的onPause()onResume()方法中对其进行管理。使用静态getter和setter方法创建一个变量,例如private boolean myActivityOnTop = false。在onPause()中,将此变量设置为false,并在onResume中再次将其设置为true。然后用getter方法替换isActivityOnTop()。如果你想通过将这个活动设置为int,string或enum并在调用任何活动'onResume时设置它,你可以做同样的事情。

另外,只是一个提示,每当一个Activity被推到后台时,都不能保证Android不会破坏它。您可以将displayAlertOnStart设置为true,但随后会销毁Activity。当它在返回到前面时重新启动时,将重新创建活动,并且不会知道显示对话框。在开始新活动后您想要维护的任何变量应该在onSaveInstanceState()中捆绑,并在onCreate()onRestoreInstanceState()中重新初始化。