Обработка одновременности в синхронизации нескольких файлов на Android Wear - PullRequest
0 голосов
/ 17 февраля 2019

Я пишу приложение для Android Wear 2.0, и я пытаюсь синхронизировать (или отправить) из переносного приложения в портативный набор файлов.Я использую ChannelClient примитивы, но у меня есть некоторые проблемы при отправке нескольких файлов одновременно.В документе Google о задачах я читал, что

Tasks.await (задача) Блокируйте задачу и получайте результат синхронно.Обычно это делается при выполнении задачи в отдельном управляемом фоновом потоке.

Итак, предположим, что этот вызов блокирует мою логику для отправки файлов:

Носимыйкод:

sendDataButton.setOnClickListener(view -> {
            if (isRecording)
                startButton.performClick();
            new Thread(this::sendData).start();
        });
... 

private synchronized void sendData() {
        if (transcriptionNodeId != null) {
            ChannelClient channelClient = Wearable.getChannelClient(this);
            Task<ChannelClient.Channel> channelClientTask = channelClient.openChannel(transcriptionNodeId, FILE_EXCHANGE_PATH);
            Log.d(TAG, "sendData: Start sending files");
            try {
                ChannelClient.Channel channel = Tasks.await(channelClientTask);
                for (File file : getFilesDir().listFiles()) {
                    if (file.isFile()) {
                        Log.d(TAG, "sendData: " + file.getName());
                        Tasks.await(channelClient.sendFile(channel, Uri.fromFile(file)));
                    }
                }
            } catch (InterruptedException | ExecutionException e) {
                e.printStackTrace();
                Log.e(TAG, "sendData: " + e.getMessage());
            }
        } else {
            Log.e(TAG, "sendData: transcription Node id == null!");
        }
    }

Код КПК

//  inside onCreate

channelCallback = new ChannelClient.ChannelCallback() {
            @Override
            public void onChannelOpened(@NonNull ChannelClient.Channel channel) {
                super.onChannelOpened(channel);
                writeDebug("Channel opened");
                if (channel.getPath().equals(FILE_EXCHANGE_PATH)) {
                    writeDebug("Path del channel corretto");
                    new Thread(() -> {
                        try {
                            Tasks.await(channelClient.receiveFile(channel, Uri.fromFile(new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS), "wear_hr_data.csv")), false));
                        } catch (InterruptedException | ExecutionException e) {
                            e.printStackTrace();
                            writeErrorDebug(e.getMessage());
                        }
                    }).start();
                } else {
                    writeErrorDebug("path del channel = " + channel.getPath());
                }
            }
// unrelevant callbacks
... 
// final part onCreate
channelClient = Wearable.getChannelClient(this);
channelClient.registerChannelCallback(channelCallback);

Проблема заключается в том, что когда я выполняю этот код, мне дает носимое приложение com.google.android.gms.common.api.ApiException: 8: 'со следующей трассировкой стека:

2019-02-17 19:09:19.649 4054-4083/thecave.forge.biowatchapp D/MainActivity: sendData: Start sending files
    2019-02-17 19:09:20.327 4054-4083/thecave.forge.biowatchapp D/MainActivity: sendData: febbraio_14_2019_0.csv
    2019-02-17 19:09:20.360 4054-4083/thecave.forge.biowatchapp D/MainActivity: sendData: febbraio_15_2019_0.csv
    2019-02-17 19:09:20.512 4054-4083/thecave.forge.biowatchapp W/System.err: java.util.concurrent.ExecutionException: com.google.android.gms.common.api.ApiException: 8: 
    2019-02-17 19:09:20.513 4054-4083/thecave.forge.biowatchapp W/System.err:     at com.google.android.gms.tasks.Tasks.zzb(Unknown Source:61)
    2019-02-17 19:09:20.514 4054-4083/thecave.forge.biowatchapp W/System.err:     at com.google.android.gms.tasks.Tasks.await(Unknown Source:23)
    2019-02-17 19:09:20.517 4054-4083/thecave.forge.biowatchapp W/System.err:     at thecave.forge.biowatchapp.MainActivity.sendData(MainActivity.java:182)
    2019-02-17 19:09:20.517 4054-4083/thecave.forge.biowatchapp W/System.err:     at thecave.forge.biowatchapp.MainActivity.lambda$6VSRo3oaZtTXJj9TjnWoSS7fT5E(Unknown Source:0)
    2019-02-17 19:09:20.518 4054-4083/thecave.forge.biowatchapp W/System.err:     at thecave.forge.biowatchapp.-$$Lambda$MainActivity$6VSRo3oaZtTXJj9TjnWoSS7fT5E.run(Unknown Source:2)
    2019-02-17 19:09:20.521 4054-4083/thecave.forge.biowatchapp W/System.err:     at java.lang.Thread.run(Thread.java:764)
    2019-02-17 19:09:20.533 4054-4083/thecave.forge.biowatchapp W/System.err: Caused by: com.google.android.gms.common.api.ApiException: 8: 
    2019-02-17 19:09:20.534 4054-4083/thecave.forge.biowatchapp W/System.err:     at com.google.android.gms.common.internal.ApiExceptionUtil.fromStatus(Unknown Source:4)
    2019-02-17 19:09:20.537 4054-4083/thecave.forge.biowatchapp W/System.err:     at com.google.android.gms.common.internal.zai.zaf(Unknown Source:2)
    2019-02-17 19:09:20.540 4054-4083/thecave.forge.biowatchapp W/System.err:     at com.google.android.gms.common.internal.zaj.onComplete(Unknown Source:6)
    2019-02-17 19:09:20.541 4054-4083/thecave.forge.biowatchapp W/System.err:     at com.google.android.gms.common.api.internal.BasePendingResult.zaa(Unknown Source:172)
    2019-02-17 19:09:20.541 4054-4083/thecave.forge.biowatchapp W/System.err:     at com.google.android.gms.common.api.internal.BasePendingResult.setResult(Unknown Source:131)
    2019-02-17 19:09:20.542 4054-4083/thecave.forge.biowatchapp W/System.err:     at com.google.android.gms.common.api.internal.BaseImplementation$ApiMethodImpl.setResult(Unknown Source:36)
    2019-02-17 19:09:20.542 4054-4083/thecave.forge.biowatchapp W/System.err:     at com.google.android.gms.wearable.internal.zzgm.zza(Unknown Source:6)
    2019-02-17 19:09:20.543 4054-4083/thecave.forge.biowatchapp W/System.err:     at com.google.android.gms.wearable.internal.zzhc.zza(Unknown Source:3)
    2019-02-17 19:09:20.543 4054-4083/thecave.forge.biowatchapp W/System.err:     at com.google.android.gms.wearable.internal.zzel.dispatchTransaction(Unknown Source:62)
    2019-02-17 19:09:20.544 4054-4083/thecave.forge.biowatchapp W/System.err:     at com.google.android.gms.internal.wearable.zzb.onTransact(Unknown Source:12)
    2019-02-17 19:09:20.544 4054-4083/thecave.forge.biowatchapp W/System.err:     at android.os.Binder.execTransact(Binder.java:674)
    2019-02-17 19:09:20.544 4054-4083/thecave.forge.biowatchapp E/MainActivity: sendData: com.google.android.gms.common.api.ApiException: 8: 

Что не так?Я не могу понять, почему существует параллелизм, если Tasks.await - это метод блокировки, вызываемый из одного потока несколько раз.Кроме того, есть ли способы обмена большими файлами между приложением Android Wear и телефоном?

...