我有个问题
我创建了我的进度对话框
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 个!
谷歌搜索后我发现我需要使用dialog.dismiss()
,但我现在不想解雇它,需要显示另外2个元素的进度!
日志猫:
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)
编辑:似乎这不是进度对话框问题。修复 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 个元素之后复制?
谢谢