1

I have a problem

I created my progress dialog

 dialog = new ProgressDialog(InstallerActivity.this);

I have 12 apk files in my assets folder. I am trying to copy all 12 assets to sdcard with this function

 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);
        }
    }

But my app always crashes on 10 files, with an error: Window leaked. If I delete Log.e, it wont crash, but still copy only 10 files, not 12!

After googling I found that I need to use dialog.dismiss(), but I dont want to dissmiss it now, it is needed to show progress of 2 more elements!

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)

Edit: Seems like this is not a progressdialog issue. Fixed log.e line and got new error:

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)

Why it cant copy after 10th element from assets?

Thanks

POMATu
  • 3,422
  • 7
  • 30
  • 42
  • 1
    what is the crash message and stack trace? – Marek Sebera Nov 19 '11 at 13:53
  • See this question: http://stackoverflow.com/questions/2850573/activity-has-leaked-window-that-was-originally-added – nostra13 Nov 19 '11 at 14:05
  • I'd love to see what's above this error. You normally get this leaked Window errors after you had an error somewhere else and it should be right above that – DallaRosa Nov 19 '11 at 14:06
  • I have updated question. I dont use println anywhere. If I comment log.e, it wont crash, but still wont copy 2 more files – POMATu Nov 19 '11 at 14:25
  • http://stackoverflow.com/questions/2850573/activity-has-leaked-window-that-was-originally-added I have seen that. Approved answer dont clarify anything. I am not exiting activity anywhere in the app – POMATu Nov 19 '11 at 14:26
  • I am wondering, why only 10? it is crashing always on 10th element. Why? – POMATu Nov 19 '11 at 15:04
  • Using 2.2, but compiling in 2.1. Should I switch to 2.2? would it help? (target is 2.2 , I dont know why I created project in 2.1) – POMATu Nov 19 '11 at 15:53

2 Answers2

1

The stack trace in the log says that you are trying to log a message that is null. Since the only logging you are doing is Log.e("tag", e.getMessage()), this means that one of your exceptions doesn't have a message.

Try using Log.e("tag", "Something went wrong while copying files", e) instead. This will print the real stack trace of your problem.

The message about leaking a window is just a symptom of your application crashing and thus not cleaning up after itself properly. (Which in this case would involve dismissing the dialog.)

According to the discussion below, the real problem is that one of the asset files is too big. When asset files are put in the APK file, most of them are compressed. Unfortunately, Android can only unpack files below a certain size. (The exact size varies between versions and platforms.)

The trick is to avoid getting the file compressed. If you were to use the command line tools manually, there is an option to the aapt tool to do this. If you are using eclipse, the easiest way is to rename the apk files look like an image file, since they aren't compressed.

Try renaming your apk files to .png in the asset folder and then rename them as you copy them.

Albin
  • 4,180
  • 2
  • 27
  • 19
  • You are right. This is not a progressbar issue. Why it cant copy after 10th element from assets? Edited question – POMATu Nov 19 '11 at 15:24
  • 1
    There is unfortunately nothing in this post that can answer that. The error is in the loop in the copyFile method, according to the stack trace. I'd start with trying to copy just the 11th file and see if there may be something wrong with that file in particular; file name, corrupt content, empty file, too big file... – Albin Nov 19 '11 at 15:39
  • I think this can be a clue: `11-19 20:03:50.193: D/asset(21181): Data exceeds UNCOMPRESS_DATA_MAX (4412833 vs 3145728)` Do you know what that means? Logcat writes that before file that he cant copy. – POMATu Nov 19 '11 at 16:04
  • 1
    Yes, this is the problem. I will edit my post above to include the problem and the workaround. – Albin Nov 19 '11 at 16:32
  • No need I have solved it weird way (wrote in my answer). If you have a better workaround, please post it – POMATu Nov 19 '11 at 16:39
0

Excuse me for that misunderstanding.

The problem was with assets. I folowed this blog post http://ponystyle.com/blog/2010/03/26/dealing-with-asset-compression-in-android-apps/ and renamed files to .jpg. now it works.

Seems that it is an android bug that does-not allow to handle assets-files bigger than 4mb.

Thanks everyone for you help!

POMATu
  • 3,422
  • 7
  • 30
  • 42