【问题标题】:Window leaked error窗口泄漏错误
【发布时间】:2011-11-19 13:50:09
【问题描述】:

我有问题

我创建了我的进度对话框

 dialog = new ProgressDialog(InstallerActivity.this);

我的资产文件夹中有 12 个 apk 文件。我正在尝试使用此功能将所有 12 个资产复制到 sdcard

 private void CopyAssets() {
        AssetManager assetManager = getAssets();
        String[] files = null;
        String[] files2 = null;
        try {
            files2 = assetManager.list("");
            List<String> sb = new ArrayList();
            for (String curfile : files2) {

                 if (curfile.endsWith("apk")) {

                 sb.add(curfile);
                 }
            }
            files = sb.toArray(new String[sb.size()]);

        } catch (IOException e) {
            Log.e("tag", e.getMessage());
        }

       dialog.setMax(files.length);
       dialog.setProgress(0);
        for(String filename : files) {
            InputStream in = null;
            OutputStream out = null;
            try {
              in = assetManager.open(filename);

              out = new FileOutputStream(externalPath + "/" + appsdir + "/" + filename);
              copyFile(in, out);
              in.close();
              in = null;
              out.flush();
              out.close();
              dialog.incrementProgressBy(1);

              out = null;
            } catch(Exception e) {
                Log.e("tag", e.getMessage());
            }       
        }
    }
    private void copyFile(InputStream in, OutputStream out) throws IOException {
        byte[] buffer = new byte[1024];
        int read;
        while((read = in.read(buffer)) != -1){
          out.write(buffer, 0, read);
        }
    }

但我的应用程序总是在 10 个文件上崩溃,并出现错误:窗口泄漏。如果我删除 Log.e,它不会崩溃,但仍然只复制 10 个文件,而不是 12 个!

谷歌搜索后发现需要使用dialog.dismiss(),但我现在不想关闭它,需要显示另外2个元素的进度!

Logcat:

11-19 18:22:13.473: D/dalvikvm(19931): GC_EXTERNAL_ALLOC freed 872 objects / 58552 bytes in 88ms
11-19 18:22:57.903: D/asset(19931): Data exceeds UNCOMPRESS_DATA_MAX (4412833 vs 3145728)
11-19 18:22:57.913: W/dalvikvm(19931): threadid=9: thread exiting with uncaught exception (group=0x4001d930)
11-19 18:22:57.943: E/AndroidRuntime(19931): FATAL EXCEPTION: Thread-10
11-19 18:22:57.943: E/AndroidRuntime(19931): java.lang.NullPointerException: println needs a message
11-19 18:22:57.943: E/AndroidRuntime(19931):    at android.util.Log.println_native(Native Method)
11-19 18:22:57.943: E/AndroidRuntime(19931):    at android.util.Log.e(Log.java:215)
11-19 18:22:57.943: E/AndroidRuntime(19931):    at com.installer.InstallerActivity.CopyAssets(InstallerActivity.java:284)
11-19 18:22:57.943: E/AndroidRuntime(19931):    at com.installer.InstallerActivity.access$1(InstallerActivity.java:246)
11-19 18:22:57.943: E/AndroidRuntime(19931):    at com.installer.InstallerActivity$3$2.run(InstallerActivity.java:169)
11-19 18:22:57.943: E/AndroidRuntime(19931):    at java.lang.Thread.run(Thread.java:1096)
11-19 18:22:58.883: E/WindowManager(19931): Activity com.installer.InstallerActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@460905c0 that was originally added here
11-19 18:22:58.883: E/WindowManager(19931): android.view.WindowLeaked: Activity com.installer.InstallerActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@460905c0 that was originally added here
11-19 18:22:58.883: E/WindowManager(19931):     at android.view.ViewRoot.<init>(ViewRoot.java:247)
11-19 18:22:58.883: E/WindowManager(19931):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
11-19 18:22:58.883: E/WindowManager(19931):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
11-19 18:22:58.883: E/WindowManager(19931):     at android.view.Window$LocalWindowManager.addView(Window.java:424)
11-19 18:22:58.883: E/WindowManager(19931):     at android.app.Dialog.show(Dialog.java:241)
11-19 18:22:58.883: E/WindowManager(19931):     at com.installer.InstallerActivity$3.onClick(InstallerActivity.java:123)
11-19 18:22:58.883: E/WindowManager(19931):     at android.view.View.performClick(View.java:2449)
11-19 18:22:58.883: E/WindowManager(19931):     at android.view.View$PerformClick.run(View.java:9027)
11-19 18:22:58.883: E/WindowManager(19931):     at android.os.Handler.handleCallback(Handler.java:587)
11-19 18:22:58.883: E/WindowManager(19931):     at android.os.Handler.dispatchMessage(Handler.java:92)
11-19 18:22:58.883: E/WindowManager(19931):     at android.os.Looper.loop(Looper.java:123)
11-19 18:22:58.883: E/WindowManager(19931):     at android.app.ActivityThread.main(ActivityThread.java:4627)
11-19 18:22:58.883: E/WindowManager(19931):     at java.lang.reflect.Method.invokeNative(Native Method)
11-19 18:22:58.883: E/WindowManager(19931):     at java.lang.reflect.Method.invoke(Method.java:521)
11-19 18:22:58.883: E/WindowManager(19931):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
11-19 18:22:58.883: E/WindowManager(19931):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
11-19 18:22:58.883: E/WindowManager(19931):     at dalvik.system.NativeStart.main(Native Method)

编辑: 似乎这不是进度对话框问题。修复 log.e 行并出现新错误:

11-19 19:17:39.533: E/tag(20559): Something went wrong while copying files
11-19 19:17:39.533: E/tag(20559): java.io.IOException
11-19 19:17:39.533: E/tag(20559):   at android.content.res.AssetManager.readAsset(Native Method)
11-19 19:17:39.533: E/tag(20559):   at android.content.res.AssetManager.access$700(AssetManager.java:36)
11-19 19:17:39.533: E/tag(20559):   at android.content.res.AssetManager$AssetInputStream.read(AssetManager.java:571)
11-19 19:17:39.533: E/tag(20559):   at com.installer.InstallerActivity.copyFile(InstallerActivity.java:292)
11-19 19:17:39.533: E/tag(20559):   at com.installer.InstallerActivity.CopyAssets(InstallerActivity.java:276)
11-19 19:17:39.533: E/tag(20559):   at com.installer.InstallerActivity.access$1(InstallerActivity.java:247)
11-19 19:17:39.533: E/tag(20559):   at com.installer.InstallerActivity$3$2.run(InstallerActivity.java:170)
11-19 19:17:39.533: E/tag(20559):   at java.lang.Thread.run(Thread.java:1096)

为什么它不能在资产的第 10 个元素之后复制?

谢谢

【问题讨论】:

  • 什么是崩溃消息和堆栈跟踪?
  • 我很想看看这个错误上面有什么。在其他地方出现错误后,您通常会收到此泄漏的 Window 错误,它应该就在此之上
  • 我已经更新了问题。我不在任何地方使用 println。如果我评论 log.e,它不会崩溃,但仍然不会再复制 2 个文件
  • stackoverflow.com/questions/2850573/… 我已经看到了。批准的答案没有澄清任何事情。我没有在应用程序的任何地方退出活动

标签: java android progressdialog assets android-assets


【解决方案1】:

日志中的堆栈跟踪表明您正在尝试记录一条为空的消息。由于您正在执行的唯一日志记录是 Log.e("tag", e.getMessage()),这意味着您的异常之一没有消息。

尝试改用Log.e("tag", "Something went wrong while copying files", e)。这将打印您的问题的真正堆栈跟踪。

有关泄漏窗口的消息只是您的应用程序崩溃的症状,因此无法正确清理自身。 (在这种情况下,这将涉及关闭对话框。)

根据下面的讨论,真正的问题是其中一个资产文件太大。资产文件放入 APK 文件时,大部分都是压缩的。不幸的是,Android 只能解压特定大小以下的文件。 (具体大小因版本和平台而异。)

诀窍是避免压缩文件。如果您要手动使用命令行工具,则 aapt 工具有一个选项可以执行此操作。如果您使用的是 eclipse,最简单的方法是将 apk 文件重命名为图像文件,因为它们没有被压缩。

尝试在资产文件夹中将您的 apk 文件重命名为 .png,然后在复制时重命名它们。

【讨论】:

  • 你是对的。这不是进度条问题。为什么它不能在资产的第 10 个元素之后复制?编辑问题
  • 不幸的是,这篇文章中没有任何内容可以回答这个问题。根据堆栈跟踪,错误在 copyFile 方法的循环中。我首先尝试仅复制第 11 个文件,看看该文件是否有问题;文件名、损坏的内容、空文件、太大的文件...
  • 我认为这可能是一个线索:11-19 20:03:50.193: D/asset(21181): Data exceeds UNCOMPRESS_DATA_MAX (4412833 vs 3145728) 你知道那是什么意思吗? Logcat 在他无法复制的文件之前写入。
  • 是的,这就是问题所在。我将编辑上面的帖子以包含问题和解决方法。
  • 不需要我用奇怪的方式解决它(写在我的答案中)。如果您有更好的解决方法,请发布它
【解决方案2】:

请原谅我的误解。

问题出在资产上。我关注了这篇博文 http://ponystyle.com/blog/2010/03/26/dealing-with-asset-compression-in-android-apps/ 并将文件重命名为 .jpg。现在可以了。

似乎这是一个不允许处理大于 4mb 的资产文件的 android 错误。

感谢大家的帮助!

【讨论】:

    猜你喜欢
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 2013-12-23
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多