在我的应用程序中,用户可以使用chooser Intent选择一个文件,然后出于安全原因,该文件将被“导入”到应用程序中并保存在内部存储中。这一切都运行得很好,在一些设备上仍然有效,但例如在Android 7.1.1上的Google Pixel上,它只对前4-6个文件正常工作,之后表现得非常奇怪。性能急剧下降,所以我检查了我的存储使用情况,发现它在持续增长,尽管我应该保存的文件不到1mb。导入文件将导致我的应用程序占用的存储量超过500mb或更高。我似乎找不到原因。
我用来保存文件的方法是在异步后台任务中调用的:
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
OutputStream fos = new FileOutputStream(file);
int size = 0;
InputStream fis = getContentResolver().openInputStream(uri);
try{
bis = new BufferedInputStream(fis);
bos = new BufferedOutputStream(fos);
byte[] buf = new byte[1024];
int len = 1024;
while((len = bis.read(buf,0,len)) != -1){
bos.write(buf,0,len);
size = size+1024;
Log.v("Bytes written",""+size);
}
}catch (IOException e){
e.printStackTrace();
}finally {
try{
if(bis != null) bis.close();
if(bos != null) bos.close();
if(fis != null) fis.close();
if(fos != null) fos.close();
}catch(IOException e){
e.printStackTrace();
}
}
return Uri.fromFile(file);然后将此函数返回的Uri保存在SQLite数据库中,供以后使用。
我很欣赏各种关于内存使用情况的提示。
顺便说一句,这并不是因为手机更新了,也不是因为我的代码有任何变化,因为我上次测试它的时候它是工作的,从那以后我就没有改变过任何东西。
发布于 2017-08-21 21:10:45
我有一个额外的方法,可以将索引附加到多次添加的文件中,例如。"file.pdf“"file1.pdf”"file2.pdf“。这种方法不正确,导致创建新文件和附加索引的无限循环。我通过更改此方法来避免循环,从而设法解决了这个问题。
回想起来,我应该在我的问题中包括这一点。
发布于 2017-08-21 20:09:33
我看到了几个需要纠正的地方:
1) write方法的签名似乎不正确,如果从缓冲区写入,则应使用write(buff, offset, length)。
2)你只读入缓冲区一次,所以写出缓冲区一次就足够了。
3)如果需要多次读取缓冲区,并多次写出值,请使用while,而不是do while。您不能保证读取操作成功。
https://stackoverflow.com/questions/45796317
复制相似问题