我为学校制作这个应用程序,需要明天提交。小问题,它在某个时刻不断崩溃。
我的应用从Firebase下载.zip并解压缩:
- 缓存目录
--images
--image01.jpg
--image02.jpg
--image03.jpg
--and so on...
--info.txt
--scan234702640.zip // this is the file that includes the /images and the info.txt
所以我在我的类imageHandler中有以下代码:
// Get the file
gsReference.getFile(localFile).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
@Override
public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
String path = "";
File f = new File(context.getExternalCacheDir().toURI());
File[] files1 = f.listFiles();
for (File inFile1 : files1) {
if (inFile1.getName().contains("scan")) {
path = context.getExternalCacheDir() + "/" + inFile1.getName();
}
}
//Decompress zip and build bitmap array
try {
ZipFile zip = new ZipFile(path);
zip.extractAll(context.getExternalCacheDir() + "/");
} catch (ZipException e){
Toast.makeText(context, "ZIP error " + e.getCode() + " : " + e.getMessage(), Toast.LENGTH_SHORT).show();
}
//Construct bitmap array
ArrayList<Bitmap> pictures = new ArrayList<Bitmap>();
File f3 = new File(context.getExternalCacheDir().toString() + "/images/");
if (f3.exists()) {
File[] files3 = f3.listFiles(); //THE PROBLEM IS SOMEWHERE HERE
if (files3 != null) {
for (File inFile3 : files3) {
if (inFile3.exists()) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap bitmap = BitmapFactory.decodeFile(inFile3.getPath(), options);
pictures.add(bitmap);
}
}
}
}
// DEBUG: Show what we have in our cache location
String message = "";
File f2 = new File(context.getExternalCacheDir().toURI() + "/images");
File[] files2 = f2.listFiles();
for (File inFile2 : files2) {
if (inFile2.isDirectory()) {
message += "/" + inFile2.getName() + "\n";
} else {
message += inFile2.getName() + "\n";
}
}
AlertDialog dialog = new AlertDialog.Builder(context)
.setTitle("Test Message")
.setMessage(message)
.show();
// END OF DEBUG
}
});
return scan;
所以,它崩溃的地方是“问题在这里”。我已经询问了所有EXTERNAL_STORAGE权限,并检查了文件是否存在。我发现,在调试模式下,它成功地将位图添加到数组中,但是当我有10个图像时,它会在加载所有10个图像后崩溃。 所以请帮助我;)
很多, 朱
修改 这是控制台日志:
10-31 00:07:31.060 7536-7536/com.julescitronic.meeting E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.julescitronic.meeting, PID: 7536
java.lang.NullPointerException: Attempt to get length of null array
at com.julescitronic.meeting.imageHandler$2.onSuccess(imageHandler.java:152)
at com.julescitronic.meeting.imageHandler$2.onSuccess(imageHandler.java:127)
at com.google.firebase.storage.StorageTask$1.zza(Unknown Source:9)
at com.google.firebase.storage.StorageTask$1.zzl(Unknown Source:4)
at com.google.firebase.storage.zze$2.run(Unknown Source:10)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
答案 0 :(得分:0)
我有同样的问题。使用Bitmap
'main.exe' is not recognized as an internal or external command,
operable program or batch file.
[Finished in 0.1s with exit code 1]
[cmd: ['main.exe']]
[dir: C:\Users\erik\Documents\Carleton University\Sysc 2006\Lab 11\Recursion\Recursion]
[path: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin;C:\Perl64\site\bin;C:\Perl64\bin;C:\ProgramData\Oracle\Java\javapath;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\MinGW\bin;C:\MinGW\mingw32\bin;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\QuickTime\QTSystem\;C:\Program Files (x86)\PharosSystems\Core;C:\Python35-32;C:\Python35-32\Lib\site-packages\;C:\Python35-32\Scripts\;C:\Program Files\TortoiseSVN\bin;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\dotnet\;C:\Program Files\Microsoft SQL Server\130\Tools\Binn\;C:\Users\erik\AppData\Local\bin\NASM;C:\Program Files\Git\cmd;C:\Users\erik\AppData\Local\Microsoft\WindowsApps;C:\altera\13.0sp1\modelsim_ase\win32aloem;C:\Users\erik\AppData\Local\GitHubDesktop\bin;]
加载图片来加载图片,因为按位图加载图片会占用大量内存并导致应用崩溃
答案 1 :(得分:0)
我发现,在调试模式下,它成功地将位图添加到数组中,但是当我有10个图像时,它在加载所有10个图像后崩溃。
根据您的上一句话,我认为您有记忆问题而不是许可问题。
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap bitmap = BitmapFactory.decodeFile(inFile3.getPath(), options);
pictures.add(bitmap);
使用此代码,您可以加载每个位图的完整大小,并将其添加到位图列表中,从而剥夺GC释放与位图关联的本机对象的权限。如果您加载一个图像,例如10 MB * 10图像,这可能是一个大问题。这很容易导致内存问题。
我建议更有效地加载位图。这意味着,您将一个缩减采样的位图加载到内存中并使用该位图,因为具有大小的位图(例如3000x4000)没有意义,如果它将显示在大小为512x384的ImageView上。这个链接是一个很好的指南,可以提供帮助:
https://developer.android.com/topic/performance/graphics/load-bitmap.html
答案 2 :(得分:0)
listFiles();
是一个文件权限,我在Android API 23及更高版本的代码中遇到了类似的崩溃(因为在运行时需要文件存储权限),所以我提供了如下相同的内容:
if (Build.VERSION.SDK_INT >= 23) {
if (AppMain.mContext.checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
Log.v(TAG, "Permission is granted");
return true;
} else {
ActivityCompat.requestPermissions(activityContext, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
return false;
}
在此之后,我没有在listFile操作上获得空指针。