我在某个活动中遇到了监听器的问题.
问题是这个监听器包含一个alert.show(); 在我们尝试推送新活动(然后给出例外)之后可以调用它.
例如:我正在通过活动A收听来自其他电话的信号.我按下然后尝试运行一个新的活动B,但程序因为alert.show()A的监听器而崩溃.
ERROR/AndroidRuntime(3573): android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@476c21c0 is not valid; is your activity running?
Run Code Online (Sandbox Code Playgroud)
我是否可以在A的监听器中检查此活动是否处于活动状态,然后根据此值显示警告?
har*_*ism 65
可能有一种我无法想到的更简单的方法,但一种方法是自己实现它.在onResume()您将成员变量设置mIsRunning为true并onPause()返回false时.使用此布尔值,您应该知道不要调用alert.show()回调.
Sam*_*met 17
ArrayList<String> runningactivities = new ArrayList<String>();
ActivityManager activityManager = (ActivityManager)getBaseContext().getSystemService (Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> services = activityManager.getRunningTasks(Integer.MAX_VALUE);
for (int i1 = 0; i1 < services.size(); i1++) {
runningactivities.add(0,services.get(i1).topActivity.toString());
}
if(runningactivities.contains("ComponentInfo{com.app/com.app.main.MyActivity}")==true){
Toast.makeText(getBaseContext(),"Activity is in foreground, active",1000).show();
alert.show()
}
Run Code Online (Sandbox Code Playgroud)
这样,您将知道指向的活动是否是当前可见活动,否则您的警报将不会显示.
这仅在我们在没有完成的两个活动之间导航时才有效.
Ali*_*raf 11
当后台线程完成其工作并尝试显示Dialog时,Activity将在其销毁时发生这种情况.
这个例子很少能够重现,但是当我们做一些异步任务/后台操作并想要显示一个带有Activity上下文的对话框时,这意味着我们的活动由于某种原因而破坏了自己.
Android操作系统应该处理这种情况,但截至目前它还没有.
所以在调用对话框之前,只需检查活动是否正在运行而不是在销毁阶段.
if(!isFinishing()){
callDialog();
}
Run Code Online (Sandbox Code Playgroud)
完成网络任务后的后台线程在主线程上调用onSuccess()/ onFailure()回调.如果在那时,启动此后台线程任务的活动不在前台,并且您尝试在onSuccess()/ onFailure()中使用getActivity(),它将为您提供异常.因此,在进行任何UI操作之前,请尝试添加此检查.
if(!((Activity) context).isFinishing())
{
//show alert
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
81463 次 |
| 最近记录: |