Reputation: 3472
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
Upvotes: 1
Views: 464
Reputation: 3472
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!
Upvotes: 0
Reputation: 4220
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.
Upvotes: 1