Окно просочилось ошибка - PullRequest
       41

Окно просочилось ошибка

1 голос
/ 19 ноября 2011

У меня проблема

Я создал свой диалог прогресса

 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!

После поиска в Google я обнаружил, что мне нужно использовать 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)

Редактировать: Похоже, что это не проблема 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 ]

1 голос
/ 19 ноября 2011

Трассировка стека в журнале говорит о том, что вы пытаетесь записать сообщение с нулевым значением. Поскольку единственное ведение журнала - Log.e("tag", e.getMessage()), это означает, что одно из ваших исключений не имеет сообщения.

Попробуйте использовать Log.e("tag", "Something went wrong while copying files", e). Это напечатает реальную трассировку стека вашей проблемы.

Сообщение об утечке окна является лишь признаком сбоя вашего приложения и, следовательно, неправильной очистки самого себя. (Что в данном случае может привести к закрытию диалога.)

Согласно приведенному ниже обсуждению, реальная проблема заключается в том, что один из файлов ресурсов слишком велик. Когда файлы активов помещаются в файл APK, большинство из них сжимаются. К сожалению, Android может распаковывать файлы только определенного размера. (Точный размер зависит от версии и платформы.)

Хитрость заключается в том, чтобы избежать сжатия файла. Если вам нужно было использовать инструменты командной строки вручную, для этого есть возможность использовать инструмент aapt. Если вы используете eclipse, самый простой способ - переименовать файлы apk в файл изображения, поскольку они не сжаты.

Попробуйте переименовать файлы apk в .png в папке ресурсов, а затем переименовать их при копировании.

0 голосов
/ 19 ноября 2011

Простите за это недоразумение.

Проблема была с активами.Я последовал за этим сообщением в блоге http://ponystyle.com/blog/2010/03/26/dealing-with-asset-compression-in-android-apps/ и переименовал файлы в .jpg.теперь это работает.

Похоже, что это ошибка Android, которая не позволяет обрабатывать файлы ресурсов размером более 4 МБ.

Спасибо всем за помощь!

...