Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 当活动处于焦点内或焦点外时处理异步任务完成_Android_User Interface_Android Asynctask - Fatal编程技术网

Android 当活动处于焦点内或焦点外时处理异步任务完成

Android 当活动处于焦点内或焦点外时处理异步任务完成,android,user-interface,android-asynctask,Android,User Interface,Android Asynctask,我有以下Android场景: “我的活动”启动异步任务以执行后台活动(AsyncTaskclass),然后搜索帐户。如果没有帐户,则在上一个AsyncTask仍在运行时,通过AbstractAuthenticator调用创建新帐户的UI 该任务最终将完成并在我之前活动的主线程上运行onPostExecute 我的问题如下:如果任务在我的活动处于顶部时完成,则会正确显示警报对话框;相反,如果任务在用户输入新帐户的用户名/密码时完成,则在尝试显示警报时,我会得到一个InvocationTargetE

我有以下Android场景:

“我的活动”启动异步任务以执行后台活动(
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()以有尊严的方式,或者以野蛮的方式,通过不这样做。如果它以野蛮的方式这样做,您将什么也做不了,虽然你会留下一个孤立的异步任务。虽然这种情况并不经常发生,但如果很关键的话,你需要考虑一下。我发现了一个很好的参考资料,它描述了当用户和操作系统创建、暂停和销毁活动时调用哪些方法。