私のアプリケーションでは、ユーザは選択肢のインテントを使用してファイルを選択できますが、その理由はアプリケーションに「インポート」され、これはうまくいっていて、まだ一部のデバイスでは機能していますが、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);
ウリこの関数はその後、SQLiteデータベースに保存されて返され、後に使用します。
このメモリの使用状況のヒントはありますか?
Btwこれは電話でのアップデートやコードの変更から生じたものではありません。テストした最後の時点で動作していたため、何も変更していません。
多分、問題は他の場所です。あなたはこの操作を複数回トリガしますか? –
解決策ではありませんが、ファイル/ネットワークI/Oの一般的な提案です。自分自身で実装するのは残念です(例えば、 'fos'は開いたままで、read()はバッファを満たすことはできません)。あなたはOkioなどの図書館を自由に使えます。 3行にファイルをコピーする:https://twitter.com/jessewilson/status/529497763625455616? – orip
@AndrzejZabost私はすでにブレークポイントを使ってこれをチェックしようとしましたが、複数の呼び出しを見つけることができませんでした。ファイルを保存するasyncTaskはonActivityResultから呼び出されます。 –