Я пишу приложение для 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 и телефоном?