Открытие нескольких файлов с помощью openFileInput (Uri) и многопоточности - PullRequest
0 голосов
/ 21 января 2020

Я пытаюсь открыть несколько файлов с несколькими потоками, используя 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);
}

Печать первых 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() возвращает текущий контекст.

Пожалуйста, если вы могли бы помочь мне, я Я очень ценю это. Спасибо!

1 Ответ

0 голосов
/ 22 января 2020

Исправлено!

Решение в этом случае состоит в том, чтобы сделать метод private String getVideoData(Uri uri) stati c и синхронизировать (private static synchronized String getVideoData(Uri uri)). Я думаю, проблема в том, что некоторые операции, используемые в коде, используют метод или переменную stati c. Поэтому, сделав метод stati c и синхронизировав его, он будет ожидать завершения других потоков до sh перед началом операции.

В этом случае InputStream fis = activity.getContentResolver().openInputStream(uri);, вероятно, является причиной проблемы.

...