4

SAF (ストレージ アクセス フレームワーク) を使用してファイルを SD カードに書き込みます。Marshmallow では、ファイルが実際に書き込まれ、大幅な遅延 (約 10 秒) で更新されます。

私が使用する場合:

android.support.v4.provider.DocumentFile docFile = DocumentFile.fromTreeUri(context, getUri()) // tree uri that represents some existing file on sd card
File file = getFile(getUri()); // java.io.File that points to same file as docFile

docFile.length(); // length of current file is e.g. 150B
file.length(); // length of file is also 150B
try (OutputStream outStream = context.getContentResolver().getOutputStream(docFile.getUri()))
{
   outStream.write(data, 0, 50); // overwrite with 50 B
   outStream.flush(); // didn't help
}

docFile.length(); // it still returns 150B !!
file.length(); // it still returns 150B

Thread.sleep(12000); // sleep 12 seconds

docFile.length(); // now it returns  correctly 50B
file.length(); // now it returns  correctly 50B

ところで。File.length()メソッドで長さを確認すると、同じ値が返されます。

すぐに書く方法はありますか?または、リスナーを設定できますか?それ以外の場合は、サイズを定期的に確認する必要があり、このようにしたくありません。実際、ファイルが書き込まれてから 10 秒も待ちたくありません。

4

1 に答える 1

1

java.io.Fileそのため、SAF api と両方を使用すると遅延が発生することがわかりました。File.isDirectory()メソッド、によってファイルをチェックするとFile.exists()File.length()後続の の呼び出しが発生します。

context.getContentResolver().getOutputStream(someUri))

10秒遅れます。削除も遅れます。つまり、あなたがしようとするとき:

DocumentFile docFile = DocumentFile.fromTreeUri(context, someUri);
File file = new File("path to same file as someUri");
if(file.exists() && !file.isDirectory()) // this cause the delay
{
  docFile.delete();
}

boolean exists = file.exists(); // exists is INCORRECTLY true
exists = docFile.exists(); // exists is INCORRECTLY true

Thread.sleep(12000);

exists = file.exists(); // exists is CORRECTLY false
exists = docFile.exists(); // exists is CORRECTLY false

File クラスの方が高速だったので、読み取り専用操作に使用しました。でもマシュマロ以来、SAFとの併用はできません。厳密に SAF API を使用する必要があります。

DocumentFile docFile = DocumentFile.fromTreeUri(context, someUri);
if(docFile.exists() && !docFile.isDirectory()) // this cause the delay
{
  docFile.delete();
}

boolean exists = docFile.exists(); // exists is CORRECTLY false
于 2016-04-05T09:37:47.097 に答える