2017-08-21 6 views
0

私のアプリケーションでは、ユーザは選択肢のインテントを使用してファイルを選択できますが、その理由はアプリケーションに「インポート」され、これはうまくいっていて、まだ一部のデバイスでは機能していますが、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これは電話でのアップデートやコードの変更から生じたものではありません。テストした最後の時点で動作していたため、何も変更していません。

+0

多分、問題は他の場所です。あなたはこの操作を複数回トリガしますか? –

+1

解決策ではありませんが、ファイル/ネットワークI/Oの一般的な提案です。自分自身で実装するのは残念です(例えば、 'fos'は開いたままで、read()はバッファを満たすことはできません)。あなたはOkioなどの図書館を自由に使えます。 3行にファイルをコピーする:https://twitter.com/jessewilson/status/529497763625455616? – orip

+0

@AndrzejZabost私はすでにブレークポイントを使ってこれをチェックしようとしましたが、複数の呼び出しを見つけることができませんでした。ファイルを保存するasyncTaskはonActivityResultから呼び出されます。 –

答えて

0

私は、ファイルにインデックスを追加します追加のメソッドが複数回などを追加しました。 "file.pdf"、 "file1.pdf"、 "file2.pdf"。このメソッドは正しくないため、新しいファイルを作成してインデックスを追加するという無限ループにつながりました。ループを避けるために、この方法を変更することで問題を解決しました。

振り返ってみると、それは私の質問に含めるべきでした。

0

私は修正するために物事のカップルを参照してください。

1)あなたはwrite(buff, offset, length)を使用する必要があり、バッファから書き込む場合はwriteメソッドのシグネチャは、正しいいないようです。

2)バッファに一度読み込むので、バッファも一度書き出すのは難しいはずです。

3)バッファを複数回読み取って値を複数回書き出す必要がある場合は、do whileではなく、whileを使用してください。あなたは、読み取り操作が成功したという保証はありません。

Ref to write method in Android Developer

+0

私はあなたの提案に従って私のコードを変更しました(それは意味がある、私はあまりそれについて考えなかった)が、それはまだ同じ問題があります。 –

+1

初めて読むときは2回です。最初の読み取りが失われています。 – Juan

+0

また、読み取った署名を確認してください。オフセットと足がありません。 https://developer.android.com/reference/java/io/BufferedInputStreamhtml#read(byte []、%20int、%20int) – Juan

関連する問題