窗口泄漏错误

时间:2011-11-19 13:50:09

标签: java android progressdialog assets android-assets

我遇到了问题

我创建了进度对话框

 dialog = new ProgressDialog(InstallerActivity.this);

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

 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(),但我现在不想忽略它,需要显示另外两个元素的进度!

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)

编辑: 似乎这不是progressdialog问题。修复了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个元素?

由于

2 个答案:

答案 0 :(得分:1)

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

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

关于泄漏窗口的消息只是应用程序崩溃的一个症状,因此无法正常清理。 (在这种情况下,将涉及解除对话。)

根据下面的讨论,真正的问题是其中一个资产文件太大了。将资产文件放入APK文件时,大多数文件都会被压缩。不幸的是,Android只能解压缩一定大小的文件。 (确切的大小因版本和平台而异。)

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

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

答案 1 :(得分:0)

请原谅我的误解。

问题出在资产上。我在博客文章http://ponystyle.com/blog/2010/03/26/dealing-with-asset-compression-in-android-apps/中添加了文章,并将文件重命名为.jpg。现在它有效。

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

谢谢大家的帮助!