[英]Opening multiple files with openFileInput(Uri) and multithreading
我正在嘗試使用context.getContentResolver().openInputStream(Uri)
打開具有多個線程的多個文件,但似乎在讀取時,所有線程都從同一個文件中讀取。 我試過使方法synchronized
但沒有奏效。 這是代碼:
private String getVideoData(Uri uri) {
String res = null;
MyActivity activity = ActivityTransferer.getInstance().getActivity();
try {
InputStream fis = activity.getContentResolver().openInputStream(uri);
if (fis != null) {
ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
byte[] bytes = new byte[4096];
int read = fis.read(bytes);
while (read != -1) {
byteOutputStream.write(bytes);
read = fis.read(bytes);
}
byte[] data = byteOutputStream.toByteArray();
res = java.util.Base64.getEncoder().encodeToString(data);
fis.close();
byteOutputStream.close();
}
} catch (Exception e) {
e.printStackTrace();
}
return res;
}
而調用這個方法的代碼是:
private EncryptedFile encryptUri(Uri uri) {
EncryptedFile res = null;
MyActivity activity = ActivityTransferer.getInstance().getActivity();
String type = activity.getContentResolver().getType(uri);
if (type != null) {
String data;
System.out.println("Path: " + uri.getPath());
System.out.println("Type: " + type);
if (type.startsWith("video")) {
data = getVideoData(uri);
res = new EncryptedVideo();
System.out.println("Data: " + data);
res.encrypt(data, password);
}
else {
data = getImageData(uri);
res = new EncryptedPicture();
res.encrypt(data, password);
}
}
return res;
}
這是從以下調用的:
while (!toEncrypt.isEmpty()) {
file = toEncrypt.poll();
encrypted = encryptUri(file);
result.add(encrypted);
}
打印byte[] data = byteOutputStream.toByteArray();
的前 100 個byte[] data = byteOutputStream.toByteArray();
我得到:
I/System.out: 0-0-0-24-102-116-121-112-109-112-52-50-0-0-0-0-109-112-52-50-105-115-111-109-0-0-0-24-98-101-97-109-1-0-0-0-1-0-0-0-0-0-0-0-2-0-0-0-0-0--126-6-109-111-111-118-0-0-0-108-109-118-104-100-0-0-0-0-0-0-0-0-0-0-0-0-0-0-2-88-0-0--86-30-0-1-0-0-1-0-0-0-0-0-0-0-0-0-0-0-
並在其他線程上:
I/System.out: 0-0-0-24-102-116-121-112-109-112-52-50-0-0-0-0-109-112-52-50-105-115-111-109-0-0-0-24-98-101-97-109-1-0-0-0-1-0-0-0-0-0-0-0-2-0-0-0-0-0--126-6-109-111-111-118-0-0-0-108-109-118-104-100-0-0-0-0-0-0-0-0-0-0-0-0-0-0-2-88-0-0--86-30-0-1-0-0-1-0-0-0-0-0-0-0-0-0-0-0-
打印:
for (int i = 0; i < 100; i++)
System.out.print(data[i] + "-");
使用 Base64 編碼(顯然也相同):
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
順便說一下, ActivityTransferer.getInstance().getActivity()
返回當前的上下文。
請如果你能幫助我,我將不勝感激。 謝謝!
修復!
這種情況下的解決方案是使方法private String getVideoData(Uri uri)
靜態和同步( private static synchronized String getVideoData(Uri uri)
)。 我認為問題在於代碼中使用的某些操作使用了靜態方法或變量。 因此,通過使方法靜態和同步,它將在開始操作之前等待其他線程完成。
在這種情況下, InputStream fis = activity.getContentResolver().openInputStream(uri);
可能是導致問題的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.