Android的泄露窗口 [英] Android leaked window

查看:110
本文介绍了Android的泄露窗口的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用的AsyncTask来收集数据,然后开始新的活动,但我得到一份泄露的窗口。

 类GetDataTask扩展的AsyncTask<太虚,太虚,太虚> {    @覆盖
    在preExecute保护无效()    {
        mProgressDialog =新ProgressDialog(getActivity());
        mProgressDialog.setMessage(+ selectedSport +获取时间表......);
        mProgressDialog.setCancelable(假);
        mProgressDialog.show();
    }    @覆盖
    保护无效doInBackground(无效... PARAMS)
    {
        XmlPullFeedParser xpfp =新XmlPullFeedParser(scheduleURLtoGet);
        ArrayList的<事件> allEvents = xpfp.getEvents();
        scheduleToPassAlong = allEvents.toArray(新事件[allEvents.size()]);
        返回null;
    }    @覆盖
    保护无效onPostExecute(无效RES)
    {
        mProgressDialog.dismiss();
        startScheduleActivity();
    }
}私人无效startScheduleActivity(){
    意向意图=新意图(这一点,ScheduleBoard.class);
    intent.putExtra(SPORT_NAME_EXTRA,selectedSport);
    intent.putExtra(SCHEDULE_FOR_SPORT_EXTRA,scheduleToPassAlong);
    startActivity(意向);
}

唯一的例外似乎在ScheduleBoard活动中发生的事情,但doInBackground内的过程无法完成。

下面是栈,我仍然无法弄清楚发生了什么。我曾经的try / catch在doInBackground,并没有什么是越来越触发:

  07-31 19:48:18.667:E /窗口管理器(2866):活动com.myproj.activities.ScheduleBoard渗漏窗口com.android.internal.policy.impl.PhoneWindow $ @ DecorView是40557718最初加入这里
07-31 19:48:18.667:E /窗口管理器(2866):android.view.WindowLeaked:活动com.myproj.activities.ScheduleBoard渗漏窗口com.android.internal.policy.impl.PhoneWindow$DecorView@40557718这是原本在这里添加
07-31 19:48:18.667:E /窗口管理器(2866):在android.view.ViewRoot<&初始化GT;(ViewRoot.java:263)
07-31 19:48:18.667:E /窗口管理器(2866):在android.view.WindowManagerImpl.addView(WindowManagerImpl.java:171)
07-31 19:48:18.667:E /窗口管理器(2866):在android.view.WindowManagerImpl.addView(WindowManagerImpl.java:114)
07-31 19:48:18.667:E /窗口管理器(2866):在android.view.Window $ LocalWindowManager.addView(Window.java:424)
07-31 19:48:18.667:E /窗口管理器(2866):在android.app.Dialog.show(Dialog.java:241)
07-31 19:48:18.667:E /窗口管理器(2866):在android.app.AlertDialog $ Builder.show(AlertDialog.java:810)
07-31 19:48:18.667:E /窗口管理器(2866):在com.myproj.activities.ScheduleBoard.displayNoStoriesMessageAndExit(ScheduleBoard.java:114)
07-31 19:48:18.667:E /窗口管理器(2866):在com.myproj.activities.ScheduleBoard.populateTable(ScheduleBoard.java:62)
07-31 19:48:18.667:E /窗口管理器(2866):在com.myproj.activities.ScheduleBoard.onCreate(ScheduleBoard.java:56)
07-31 19:48:18.667:E /窗口管理器(2866):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
07-31 19:48:18.667:E /窗口管理器(2866):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
07-31 19:48:18.667:E /窗口管理器(2866):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
07-31 19:48:18.667:E /窗口管理器(2866):在android.app.ActivityThread.access $ 1500(ActivityThread.java:117)
07-31 19:48:18.667:E /窗口管理器(2866):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:935)
07-31 19:48:18.667:E /窗口管理器(2866):在android.os.Handler.dispatchMessage(Handler.java:99)
07-31 19:48:18.667:E /窗口管理器(2866):在android.os.Looper.loop(Looper.java:130)
07-31 19:48:18.667:E /窗口管理器(2866):在android.app.ActivityThread.main(ActivityThread.java:3687)
07-31 19:48:18.667:E /窗口管理器(2866):在java.lang.reflect.Method.invokeNative(本机方法)
07-31 19:48:18.667:E /窗口管理器(2866):在java.lang.reflect.Method.invoke(Method.java:507)
07-31 19:48:18.667:E /窗口管理器(2866):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:842)
07-31 19:48:18.667:E /窗口管理器(2866):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
07-31 19:48:18.667:E /窗口管理器(2866):在dalvik.system.NativeStart.main(本机方法)


解决方案

这是发生,因为您的活动获取的破坏,ProgressDialog泄漏。您可以通过$ P $复制此pssing电源按钮时进度显示或转动屏幕90度。

您需要使用进程对话,做的是解雇他们的的onPause 和恢复 onResume 在我的实践中也可以得到pretty复杂的追踪这种东西。当我开始的AsyncTask 活动我勾的AsyncTask 应用和上脱钩完成。应用对象存储什么活动有什么任务运行,当你点击主页并返回到应用程序可以恢复进度对话框信息。

I am using AsyncTask to gather data, and then start a new activity, but I am getting a leaked window.

    class GetDataTask extends AsyncTask<Void, Void, Void> {     

    @Override
    protected void onPreExecute()

    {
        mProgressDialog = new ProgressDialog(getActivity());
        mProgressDialog.setMessage("Getting schedule for "+selectedSport+"...");
        mProgressDialog.setCancelable(false);
        mProgressDialog.show();
    }

    @Override
    protected Void doInBackground(Void... params)
    {
        XmlPullFeedParser xpfp = new XmlPullFeedParser(scheduleURLtoGet);
        ArrayList<Event> allEvents = xpfp.getEvents();
        scheduleToPassAlong = allEvents.toArray(new Event[allEvents.size()]);           
        return null;
    }

    @Override
    protected void onPostExecute(Void res)
    {     
        mProgressDialog.dismiss();
        startScheduleActivity();
    }
}

private void startScheduleActivity(){
    Intent intent = new Intent(this, ScheduleBoard.class);
    intent.putExtra(SPORT_NAME_EXTRA, selectedSport);
    intent.putExtra(SCHEDULE_FOR_SPORT_EXTRA, scheduleToPassAlong);
    startActivity(intent);
}

The exception seems to be happening in the ScheduleBoard activity, but the process inside the doInBackground does not complete.

Here is the stack, I still can't figure out what is happening. I have try/catch in the doInBackground, and nothing is getting triggered:

     07-31 19:48:18.667: E/WindowManager(2866): Activity com.myproj.activities.ScheduleBoard has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@40557718 that was originally added here
07-31 19:48:18.667: E/WindowManager(2866): android.view.WindowLeaked: Activity com.myproj.activities.ScheduleBoard has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@40557718 that was originally added here
07-31 19:48:18.667: E/WindowManager(2866):  at android.view.ViewRoot.<init>(ViewRoot.java:263)
07-31 19:48:18.667: E/WindowManager(2866):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:171)
07-31 19:48:18.667: E/WindowManager(2866):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:114)
07-31 19:48:18.667: E/WindowManager(2866):  at android.view.Window$LocalWindowManager.addView(Window.java:424)
07-31 19:48:18.667: E/WindowManager(2866):  at android.app.Dialog.show(Dialog.java:241)
07-31 19:48:18.667: E/WindowManager(2866):  at android.app.AlertDialog$Builder.show(AlertDialog.java:810)
07-31 19:48:18.667: E/WindowManager(2866):  at com.myproj.activities.ScheduleBoard.displayNoStoriesMessageAndExit(ScheduleBoard.java:114)
07-31 19:48:18.667: E/WindowManager(2866):  at com.myproj.activities.ScheduleBoard.populateTable(ScheduleBoard.java:62)
07-31 19:48:18.667: E/WindowManager(2866):  at com.myproj.activities.ScheduleBoard.onCreate(ScheduleBoard.java:56)
07-31 19:48:18.667: E/WindowManager(2866):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
07-31 19:48:18.667: E/WindowManager(2866):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
07-31 19:48:18.667: E/WindowManager(2866):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
07-31 19:48:18.667: E/WindowManager(2866):  at android.app.ActivityThread.access$1500(ActivityThread.java:117)
07-31 19:48:18.667: E/WindowManager(2866):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
07-31 19:48:18.667: E/WindowManager(2866):  at android.os.Handler.dispatchMessage(Handler.java:99)
07-31 19:48:18.667: E/WindowManager(2866):  at android.os.Looper.loop(Looper.java:130)
07-31 19:48:18.667: E/WindowManager(2866):  at android.app.ActivityThread.main(ActivityThread.java:3687)
07-31 19:48:18.667: E/WindowManager(2866):  at java.lang.reflect.Method.invokeNative(Native Method)
07-31 19:48:18.667: E/WindowManager(2866):  at java.lang.reflect.Method.invoke(Method.java:507)
07-31 19:48:18.667: E/WindowManager(2866):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
07-31 19:48:18.667: E/WindowManager(2866):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
07-31 19:48:18.667: E/WindowManager(2866):  at dalvik.system.NativeStart.main(Native Method)

解决方案

This is happening because your activity get's destroyed and ProgressDialog leaks. You can duplicate this by pressing power button when progress shows or turning screen 90 degree.

What you need to do with progress dialogs is dismissing them onPause and restoring onResume In my practice it can get pretty complex to track this kind of stuff. When I start AsyncTask from Activity I hook AsyncTask to Application and unhook on completion. Application object stores info about what Activity have what task running and can resume progress dialog when you click Home and return to application.

这篇关于Android的泄露窗口的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆