这是什么错误,为什么会发生?
05-17 18:24:57.069: ERROR/WindowManager(18850): Activity com.mypkg.myP has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44c46ff0 that was originally added here
05-17 18:24:57.069: ERROR/WindowManager(18850): android.view.WindowLeaked: Activity ccom.mypkg.myP has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44c46ff0 that was originally added here
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.view.ViewRoot.<init>(ViewRoot.java:231)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.view.Window$LocalWindowManager.addView(Window.java:424)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.app.Dialog.show(Dialog.java:239)
05-17 18:24:57.069: ERROR/WindowManager(18850): at com.mypkg.myP$PreparePairingLinkageData.onPreExecute(viewP.java:183)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.os.AsyncTask.execute(AsyncTask.java:391)
05-17 18:24:57.069: ERROR/WindowManager(18850): at com.mypkg.myP.onCreate(viewP.java:94)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2544)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2621)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.app.ActivityThread.access$2200(ActivityThread.java:126)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1932)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.os.Handler.dispatchMessage(Handler.java:99)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.os.Looper.loop(Looper.java:123)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.app.ActivityThread.main(ActivityThread.java:4595)
05-17 18:24:57.069: ERROR/WindowManager(18850): at java.lang.reflect.Method.invokeNative(Native Method)
05-17 18:24:57.069: ERROR/WindowManager(18850): at java.lang.reflect.Method.invoke(Method.java:521)
05-17 18:24:57.069: ERROR/WindowManager(18850): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
05-17 18:24:57.069: ERROR/WindowManager(18850): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
05-17 18:24:57.069: ERROR/WindowManager(18850): at dalvik.system.NativeStart.main(Native Method)
答案 0 :(得分:1422)
您在退出活动后尝试显示对话框。
<强> [编辑] 强>
这个问题是google for android开发者的热门搜索之一, 因此,从评论中添加一些重要的观点,这可能对未来的调查人员更有帮助,而无需进行深入的评论对话。
回答1 :
您在退出活动后尝试显示对话框。
回答2
在某些情况下,这个错误可能会有点误导(尽管如此 答案仍然是完全准确的) - 即在我的情况下 未处理的异常被抛入AsyncTask,导致了 要关闭的活动,然后打开progressdialog导致这个 例外..所以“真正的”例外在日志中稍早一点
回答3
在退出之前,在您创建的Dialog实例上调用dismiss() 活动,例如在onPause()或onDestroy()
答案 1 :(得分:385)
解决方法是在退出dismiss()
之前致电Dialog
您在viewP.java:183
创建的Activity
,例如在onPause()
。在离开Window
之前,应关闭所有Dialog
s&amp; Activity
。
答案 2 :(得分:106)
如果您使用AsyncTask
,可能该日志消息可能具有欺骗性。如果您在日志中查找,可能会发现另一个错误,可能是您doInBackground()
的{{1}}方法中的一个错误,即您当前的AsyncTask
爆炸,因此Activity
回来了..好吧,你知道其余的。其他一些用户已经解释过: - )
答案 3 :(得分:59)
我错误地在hide()
上调用dismiss()
而不是AlertDialog
来触发此错误。
答案 4 :(得分:53)
如果你错过了switch语句中的break调用语句,你可以通过(例如)在显示finish()
之后意外调用AlertDialog
来解决这个例外。 ..
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.new_button:
openMyAlertDialog();
break; <-- If you forget this the finish() method below
will be called while the dialog is showing!
case R.id.exit_button:
finish();
break;
}
}
finish()
方法将关闭Activity
,但AlertDialog
仍在显示!
因此,当你专心盯着代码,寻找糟糕的线程问题或复杂的编码等时,不要忽视森林中的树木。有时它可能只是一个简单而愚蠢的东西,就像一个缺失的断言。 :)
答案 5 :(得分:31)
在您退出活动后尝试显示对话框时会出现此问题。
我刚刚通过写下以下代码解决了这个问题:
@Override
public void onDestroy(){
super.onDestroy();
if ( progressDialog!=null && progressDialog.isShowing() ){
progressDialog.cancel();
}
}
基本上,从哪个类开始progressDialog,覆盖onDestroy方法并按此方式执行。它解决了“活动已经泄露窗口”的问题。
答案 6 :(得分:25)
这个问题的答案都是正确的,但对我来说实际理解为什么有些困惑。玩了大约2个小时后,这个错误的原因(在我的情况下)打了我:
通过阅读其他答案,您已经知道有X has leaked window DecorView@d9e6131[]
错误意味着当您的应用关闭时对话框已打开。但为什么呢?
可能是您的应用在对话框打开时出于其他原因而崩溃
由于您的代码中存在一些错误,导致您的应用关闭,导致对话框因应用程序因其他错误而关闭的同时保持打开状态。
所以,看看你的逻辑。解决第一个错误,然后第二个错误将自行解决
一个错误导致另一个错误,导致另一个错误,如DOMINOS!
答案 7 :(得分:19)
我最近遇到了同样的问题。
此问题背后的原因是在关闭对话框之前关闭了活动。 上述情况有多种原因。上面帖子中提到的那些也是正确的。
我遇到了一种情况,因为在线程中,我正在调用一个抛出异常的函数。因为窗户被解雇,因此是例外。
答案 8 :(得分:13)
这可能有所帮助。
if (! isFinishing()) {
dialog.show();
}
答案 9 :(得分:12)
在活动销毁
时关闭对话框@Override
protected void onDestroy()
{
super.onDestroy();
if (pDialog!=null && pDialog.isShowing()){
pDialog.dismiss();
}
}
答案 10 :(得分:11)
我在我的视频播放器应用程序中获取这些日志。视频播放器关闭时抛出这些消息。有趣的是,我曾经以随机方式在几次运行中获取这些日志。我的申请也不涉及任何progressdialog
。最后,我通过以下实现解决了这个问题。
@Override
protected void onPause()
{
Log.v("MediaVideo", "onPause");
super.onPause();
this.mVideoView.pause();
this.mVideoView.setVisibility(View.GONE);
}
@Override
protected void onDestroy()
{
Log.v("MediaVideo", "onDestroy");
super.onDestroy();
}
@Override
protected void onResume()
{
Log.v("MediaVideo", "onResume");
super.onResume();
this.mVideoView.resume();
}
通过调用OnPause
并将mVideoView.pause()
设置为visibility
来覆盖GONE
。这样我就可以解决“Activity has leaked window
”日志错误问题。
答案 11 :(得分:11)
我有同样晦涩的错误信息,不知道为什么。根据之前答案的线索,我将我的非GUI调用mDialog.finish()更改为mDialog.dismiss(),错误消失了。这并没有影响我的小部件的行为,但它令人不安,很可能已经标记了一个重要的内存泄漏。
答案 12 :(得分:10)
我遇到了同样的问题并找到了这个页面,虽然我的情况有所不同,但在定义警告框之前,我从finish
块调用if
。
因此,简单地调用dismiss
将无效(因为尚未制作)但在阅读 Alex Volovoy的答案并意识到它是导致它的警报框之后。我试图在if
块内完成后立即添加一个return语句,并修复了问题。
我想,一旦你打完了它就停止了一切并在那里完成,但事实并非如此。它似乎到了它所在的代码块的末尾然后完成。
所以,如果你想要实现一种情况,有时它会在完成一些代码之前完成,你必须在完成后立即放置一个return语句,否则它将继续运行并且表现得就像在代码块的末尾,而不是您调用它的位置。这就是为什么我得到了所有那些奇怪的错误。
private picked(File aDirectory){
if(aDirectory.length()==0){
setResult(RESULT_CANCELED, new Intent());
finish();
return;
}
AlertDialog.Builder alert= new AlertDialog.Builder(this); // Start dialog builder
alert
.setTitle("Question")
.setMessage("Do you want to open that file?"+aDirectory.getName());
alert
.setPositiveButton("OK", okButtonListener)
.setNegativeButton("Cancel", cancelButtonListener);
alert.show();
}
如果你在我在那里打完完后没有把回报放到右边,那就好像你已经在alert.show();
之后调用了它,因此它会说你的窗口在你刚完成之后就被泄露了使对话框出现,即使情况并非如此,它仍然认为是。
我想我会在这里添加这个,因为这表明结束命令的行为不同然后我认为它确实如此,我猜有其他人在我发现它之前就像我一样。
答案 13 :(得分:7)
这不是问题的答案,但它与该主题相关。
如果活动在Manifest中定义了一个属性
android:noHistory="true"
然后在执行onPause()之后,活动的上下文丢失。因此,使用此上下文的所有视图都可能会出现此错误。
答案 14 :(得分:6)
不仅尝试显示警报,还可以在完成特定活动实例并尝试启动新活动/服务或尝试停止活动时调用它。
示例:强>
OldActivity instance;
oncreate() {
instance=this;
}
instance.finish();
instance.startActivity(new Intent(ACTION_MAIN).setClass(instance, NewActivity.class));
答案 15 :(得分:5)
当我在ProgressDialog
中使用AsyncTask
时发生这种情况。实际上我在hide()
中使用onPostExecute
方法。基于@Alex Volovoy的答案,我需要使用dismiss()
和ProgressDialog
来删除onPostExecute及其完成。
progressDialog.hide(); // Don't use it, it gives error
progressDialog.dismiss(); // Use it
答案 16 :(得分:5)
如果您在doInBackground()
函数处出现错误并且拥有此代码,则可以这样做。
尝试最后添加对话框。首先检查并修复doInBackground()
功能
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(CreateAccount.this);
pDialog.setMessage("Creating Product..");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
}
protected String doInBackground(String...args) {
ERROR CAN BE IS HERE
}
protected void onPostExecute(String file_url) {
// dismiss the dialog once done
pDialog.dismiss();
答案 17 :(得分:5)
在Activity has leaked window that was originally added...
有效Activity
后尝试显示提醒时,会出现“finished
”错误。
您有两种选择AFAIK:
dismiss()
上的dialog
。dialog
放在另一个帖子中并在thread
上运行(独立于当前activity
)。答案 18 :(得分:5)
试试这段代码:
public class Sample extends Activity(){
@Override
public void onCreate(Bundle instance){
}
@Override
public void onStop() {
super.onStop();
progressdialog.dismiss(); // try this
}
}
答案 19 :(得分:5)
如果仍然显示ProgressDialog,我在完成活动的问题。
首先隐藏对话框,然后完成活动。
答案 20 :(得分:4)
通常由于进度对话框而出现此问题:您可以在活动中使用以下任一方法解决此问题:
// 1):
@Override
protected void onPause() {
super.onPause();
if ( yourProgressDialog!=null && yourProgressDialog.isShowing() )
{
yourProgressDialog.cancel();
}
}
// 2) :
@Override
protected void onDestroy() {
super.onDestroy();
if ( yourProgressDialog!=null && yourProgressDialog.isShowing()
{
yourProgressDialog.cancel();
}
}
答案 21 :(得分:4)
您必须使用Progressdialog
onPreExecute
方法制作AsyncTask
对象,并且dismiss
方法应该onPostExecute
。
答案 22 :(得分:3)
最佳解决方案是在发生异常时在try catch和dismiss对话框中添加对话框
只需使用以下代码
try {
dialog.show();
} catch (Exception e) {
dialog.dismiss();
}
答案 23 :(得分:3)
就我而言,原因是我忘了在Android清单文件中包含权限。
我是怎么知道的?好吧,就像@Bobby在接受的答案下面的评论中说的那样,只需向上滚动到你的日志,你就会看到真正抛出异常的第一个原因或事件。显然,消息“活动已泄漏最初添加的窗口”只是一个异常,它是由第一个异常引起的。
答案 24 :(得分:2)
在显示progressbar
或progressDialog
之前放置最佳解决方案
if (getApplicationContext().getWindow().getDecorView().isShown()) {
//Show Your Progress Dialog
}
答案 25 :(得分:2)
窗口泄露异常有两个原因:
1)当活动上下文不存在时显示对话框,要解决此问题,您应该只显示对话框,确定活动存在:
if(getActivity()!= null && !getActivity().isFinishing()){
Dialog.show();
}
2)不要适当地关闭对话框,解决使用此代码:
@Override
public void onDestroy(){
super.onDestroy();
if ( Dialog!=null && Dialog.isShowing() ){
Dialog.dismiss();
}
}
答案 26 :(得分:2)
尝试下面的代码,它会在您解除进度对话框的任何时候都有效,它会看到它的实例是否可用。
try {
if (null != progressDialog && progressDialog.isShowing()) {
progressDialog.dismiss();
progressDialog = null;
}
} catch (Exception e) {
e.printStackTrace();
}
答案 27 :(得分:1)
尝试从后台线程显示Toast时遇到此错误。 它是通过在UI线程上运行与UI相关的代码来解决的
答案 28 :(得分:1)
if (mActivity != null && !mActivity.isFinishing() && mProgressDialog != null && mProgressDialog.isShowing()) {
mProgressDialog.dismiss();
}
答案 29 :(得分:1)
当您想要关闭 AlertDialog,但不想在活动中对其进行引用时,这是一种解决方案。
解决方案要求您在项目中具有 androidx.lifecycle 依赖项(我相信在发表评论时这是一项常见要求)
这使您可以将对话框的关闭委托给外部对象(观察者),并且您不再需要关心它,因为当活动终止时它会自动取消订阅。 (这是证明:https://github.com/googlecodelabs/android-lifecycles/issues/5)。
因此,观察者保留对对话框的引用,而活动保留对观察者的引用。当“ onPause”发生时-观察者关闭对话框,而当“ onDestroy”发生时-活动移除观察器,因此不会发生泄漏(嗯,至少我不再在logcat中看到错误了)
// observer
class DialogDismissLifecycleObserver( private var dialog: AlertDialog? ) : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun onPause() {
dialog?.dismiss()
dialog = null
}
}
// activity code
private fun showDialog() {
if( isDestroyed || isFinishing ) return
val dialog = AlertDialog
.Builder(this, R.style.DialogTheme)
// dialog setup skipped
.create()
lifecycle.addObserver( DialogDismissLifecycleObserver( dialog ) )
dialog.show()
}
答案 30 :(得分:1)
根据我的问题是你试图在一个活动完成后立即调用一个对话框,所以根据我你可以做的是使用Handler给你一些延迟,你的问题将解决,例如:
Handler handler=new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
dialog.show();
//or
dialog.dismiss();
}
},100);
答案 31 :(得分:1)
由于代码中某处出现了一些异常,请确保您的活动未意外关闭。通常,当活动面临强制关闭doinBackground方法然后asynctask返回onPostexecute方法时,它发生在异步任务中。
答案 32 :(得分:0)
我正在制作一个已经接近4.5万行的科学应用程序,并且我使用异步任务,以便能够按需在用户单击的情况下中断长任务。
因此,有一个响应式用户界面,有时甚至是并行的长任务。
长任务结束后,我需要运行一个例程来管理用户界面。
因此,在异步任务结束时,我执行以下涉及接口的操作,该操作不能直接执行,否则会出错。所以我用
this.runOnUiThread(Runnable { x(...)}) // Kotlin
很多时候,此错误发生在功能x
的某个位置。
如果函数x
在线程外被调用
x(...) // Kotlin
Android Studio
将显示带有错误行的调用堆栈,并且很容易在几分钟内解决问题。
由于我的源代码已被驯服,并且没有严重的结构性问题(上面的许多答案都描述了这种错误),所以产生此可怕错误消息的原因更加笼统,重要性不那么重要。
这只是链接到线程的执行中的任何愚蠢错误(例如,访问超出定义长度的向量),如以下示意图示例所示:
var i = 10 // Kotlin
...
var arr = Array(5){""}
var element = arr[i] // 10 > 5, it's a index overflow
关于这个愚蠢的错误,Android Studio
不幸没有指向它。
我什至认为它是一个错误,因为Android Studio
知道它所在的地方有一个错误,但是由于某种未知的原因,它会丢失并给出一条随机消息,与问题完全脱节,即一条奇怪的消息,没有任何提示。
解决方案:在调试器中要逐步运行,直到遇到Android Studio
拒绝提供的错误行。
这件事对我来说已经发生过好几次了,我想这是 Android 项目中一个非常普遍的错误。在使用线程之前,我从未遇到过这样的错误。
没有人是绝对可靠的,我们有可能犯一些小错误。在这种情况下,您不能指望Android Studio
的直接帮助来发现错误在哪里!
答案 33 :(得分:0)
如果要处理LiveData,请在更新值而不是使用liveData.value = someValue
时尝试执行liveData.postValue(someValue)
答案 34 :(得分:0)
在活动销毁之前关闭ProgressBar
@Override
protected void onDestroy() {
try {
if (progressDialog != null)
progressDialog.dismiss();
} catch (Exception e) {
e.printStackTrace();
}
super.onDestroy();
}
答案 35 :(得分:0)
如果只是处理Dialog
在Acticity.onConfigurationChanged
出现的问题
如果只是处理Dialog
中Activity.onConfigurationChanged
的问题
//若`AndroidManifest.xml`中已经配置了`android:configChanges="orientation|screenSize|screenLayout|smallestScreenSize"`则不需要设置该项
//If `android:configChanges="orientation|screenSize|screenLayout|smallestScreenSize"` has been configured in `AndroidManifest.xml`, you do not need to set this item
Acticity/Context.registerComponentCallbacks(object : ComponentCallbacks {
override fun onConfigurationChanged(newConfig: Configuration) {
dialog?.dismiss()
}
override fun onLowMemory() {
}
})
在onDestroy
中远更保险点
在on Destroy
中销毁更安全
override fun onDestroy() {
super.onDestroy()
DialogManager.dismiss()
}
答案 36 :(得分:0)
在 Kotlin 中,这是我用来解决此问题的方法
if (!isFinishing)
dialog.show()
也许这对你有帮助!
答案 37 :(得分:0)
也许您在活动中使用findViewById
而不是dialog.findViewById
,然后在OnClickListener
实例上设置了null
,这很可能导致了原始错误。
答案 38 :(得分:0)
确保致电 this.dialog.show。 (活动)
答案 39 :(得分:0)
我也面临这个问题已经有一段时间但我意识到这不是因为dialog
因为ActionMode
而导致我ActionMode
。因此,如果您在onPause
打开时尝试完成活动,则会导致此问题。在您的活动中 private ActionMode actionMode;
@Override
public void onActionModeStarted(ActionMode mode) {
super.onActionModeStarted(mode);
actionMode = mode;
}
@Override
protected void onPause() {
super.onPause();
if (actionMode != null) actionMode.finish();
}
完成了操作模式。
function self_added_checkout_fieldsPk1($fields)
{
echo '<div class="row" style="text-aign:center">
<div class="col m4 offset-m4" align="center">
<ul class="collapsible" data-collapsible="expandable">
<li class="">
<div class="collapsible-header active"><b>Instagram Account No.1 Details</b></div>
<div class="collapsible-body" style="display: none; padding-top: 0px; margin-top: 0px; padding-bottom: 0px; margin-bottom: 0px;">
<div class="input-field col s12">
Username: <input id="acc1user" name="acc1user" type="text" class="validate" required>
Password: <input id="acc1pass" name="acc1pass" type="text" class="validate" required>Account No.1 Audience: <input id="acc1audi" name="acc1audi" type="text" class="validate" required>
Note: Your Login Credentials will be safe with us do not worry.
</div>
</div>
</li>
</ul>
</div></div>
</h1>';}
And similarly many more fields as above
#Order Meta Update code
/**
* Update the order meta with field value for Package 1
*/
add_action( 'woocommerce_checkout_update_order_meta', 'my_custom_checkout_field_update_order_meta' );
function my_custom_checkout_field_update_order_meta( $order_id ) {
//Username and Password for 1st Account of Instagram
if ( ! empty( $_POST['acc1user'] ) ) {
update_post_meta( $order_id, 'Username1', sanitize_text_field( $_POST['acc1user'] ) );
}
if ( ! empty( $_POST['acc1pass'] ) ) {
update_post_meta( $order_id, 'Password1', sanitize_text_field( $_POST['acc1pass'] ) );
}
if ( ! empty( $_POST['acc1audi'] ) ) {
update_post_meta( $order_id, 'Account No.1 Audience', sanitize_text_field( $_POST['acc1audi'] ) );
}
if ( ! empty( $_POST['acc2user'] ) ) {
update_post_meta( $order_id, 'Username2', sanitize_text_field( $_POST['acc2user'] ) );
}
if ( ! empty( $_POST['acc2pass'] ) ) {
update_post_meta( $order_id, 'Password2', sanitize_text_field( $_POST['acc2pass'] ) );
}
if ( ! empty( $_POST['acc2audi'] ) ) {
update_post_meta( $order_id, 'Account No.1]2 Audience', sanitize_text_field( $_POST['acc2audi'] ) );
}
if ( ! empty( $_POST['acc3user'] ) ) {
update_post_meta( $order_id, 'Username3', sanitize_text_field( $_POST['acc3user'] ) );
}
if ( ! empty( $_POST['acc3pass'] ) ) {
update_post_meta( $order_id, 'Password3', sanitize_text_field( $_POST['acc3pass'] ) );
}
if ( ! empty( $_POST['acc3audi'] ) ) {
update_post_meta( $order_id, 'Account No.3 Audience', sanitize_text_field( $_POST['acc3audi'] ) );
}
if ( ! empty( $_POST['acc4user'] ) ) {
update_post_meta( $order_id, 'Username4', sanitize_text_field( $_POST['acc4user'] ) );
}
if ( ! empty( $_POST['acc4pass'] ) ) {
update_post_meta( $order_id, 'Password4', sanitize_text_field( $_POST['acc4pass'] ) );
}
if ( ! empty( $_POST['acc4audi'] ) ) {
update_post_meta( $order_id, 'Account No.4 Audience', sanitize_text_field( $_POST['acc4audi'] ) );
}
if ( ! empty( $_POST['acc5user'] ) ) {
update_post_meta( $order_id, 'Username5', sanitize_text_field( $_POST['acc5user'] ) );
}
if ( ! empty( $_POST['acc5pass'] ) ) {
update_post_meta( $order_id, 'Password5', sanitize_text_field( $_POST['acc5pass'] ) );
}
if ( ! empty( $_POST['acc5audi'] ) ) {
update_post_meta( $order_id, 'Account No.5 Audience', sanitize_text_field( $_POST['acc5audi'] ) );
}
if ( ! empty( $_POST['acc6user'] ) ) {
update_post_meta( $order_id, 'Username6', sanitize_text_field( $_POST['acc6user'] ) );
}
if ( ! empty( $_POST['acc6pass'] ) ) {
update_post_meta( $order_id, 'Password6', sanitize_text_field( $_POST['acc6pass'] ) );
}
}
答案 40 :(得分:0)
运行monkey test时我也遇到了WindowLeaked问题.logcat在下面。
android.support.v7.app.AppCompatDelegateImplV7$ListMenuDecorView@4334fd40 that was originally added here
android.view.WindowLeaked: Activity com.myapp.MyActivity has leaked window android.support.v7.app.AppCompatDelegateImplV7$ListMenuDecorView@4334fd40 that was originally added here
at android.view.ViewRootImpl.<init>(ViewRootImpl.java:409)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:312)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224)
at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149)
at android.view.Window$LocalWindowManager.addView(Window.java:554)
at android.support.v7.app.AppCompatDelegateImplV7.openPanel(AppCompatDelegateImplV7.java:1150)
at android.support.v7.app.AppCompatDelegateImplV7.onKeyUpPanel(AppCompatDelegateImplV7.java:1469)
at android.support.v7.app.AppCompatDelegateImplV7.onKeyUp(AppCompatDelegateImplV7.java:919)
at android.support.v7.app.AppCompatDelegateImplV7.dispatchKeyEvent(AppCompatDelegateImplV7.java:913)
at android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.dispatchKeyEvent(AppCompatDelegateImplBase.java:241)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:2009)
at android.view.ViewRootImpl.deliverKeyEventPostIme(ViewRootImpl.java:3929)
at android.view.ViewRootImpl.deliverKeyEvent(ViewRootImpl.java:3863)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3420)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4528)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4506)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4610)
at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:171)
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:125)
at android.os.Looper.loop(Looper.java:124)
at android.app.ActivityThread.main(ActivityThread.java:4898)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1008)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:775)
at dalvik.system.NativeStart.main(Native Method)
我的活动是AppCompatActivity.And我使用活动中的以下代码对其进行了重新调整。
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
// added by sunhang : intercept menu key to resove a WindowLeaked error in monkey-test.
if (event.getKeyCode() == KeyEvent.KEYCODE_MENU) {
return true;
}
return super.dispatchKeyEvent(event);
}
答案 41 :(得分:0)
我有另一个解决方案,想知道它是否对您有效:而不是在onDestroy中解雇,这似乎是领先的解决方案,我正在扩展ProgressDialog ......
public class MyProgressDialog extends ProgressDialog {
private boolean isDismissed;
public MyProgressDialog(Context context) {
super(context);
}
@Override
public void onDetachedFromWindow() {
super.onDetachedFromWindow();
dismiss();
}
@Override
public void dismiss() {
if (isDismissed) {
return;
}
try {
super.dismiss();
} catch (IllegalArgumentException e) {
// ignore
}
isDismissed = true;
}
这是首选AFAIC,因为您不必将进度对话框作为成员持有,只需触发(显示)并忘记
答案 42 :(得分:0)
我遇到了同样的问题。该错误不在Dialog
中,而在EditText
中。我试图更改Edittext
内Assynctask
的值。我唯一能解决的就是创建一个新的runnable
。
runOnUiThread(new Runnable(){
@Override
public void run() {
...
}
});
答案 43 :(得分:0)
我正在使用视频播放器的“onError”对话框,而不是发疯(我已经测试了所有这些解决方案)
我选择DialogFragment
http://developer.android.com/reference/android/app/DialogFragment.html。
您可以在内部DialogFragment
课程中返回构建器创建,只需覆盖onCreateDialog