我遇到了问题
我创建了进度对话框
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个元素?
由于
答案 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的资产文件。
谢谢大家的帮助!