android - ANR 向可穿戴设备发送大文件
问题描述
考虑到有关使用ChannelClient类将文件从手机发送到可穿戴设备的最少文档,我已经让它工作了。但是,我在发送较大的文件时收到 ANR 错误。我正在使用 aForeground Service
来处理我认为用于长时间运行任务的上传。奇怪的是,ANR 发生在Activity
用户选择要上传的文件的地方。
服务
public class UploadFile extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
createForegroundNotification();
Uri fileUri = Uri.parse(intent.getExtras().getString("file"));
String fileName = getFileName(fileUri);
List<Node> nodes = Utilities.getNodesAsync();
for (Node node : nodes) {
ChannelClient channelClient = Wearable.getChannelClient(context);
channelClient.openChannel(node.getId(), fileName).addOnSuccessListener(channel -> {
Task<OutputStream> outputStreamTask = channelClient.getOutputStream(channel);
outputStreamTask.addOnSuccessListener(outputStream -> {
try {
InputStream inputStream = context.getContentResolver().openInputStream(fileUri);
ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = inputStream.read(buffer)) > 0)
byteBuffer.write(buffer, 0, len);
outputStream.write(byteBuffer.toByteArray());
outputStream.flush();
outputStream.close();
inputStream.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
stopForeground(true);
}
});
});
}
}
}
用户添加活动:
mFileUploadButton.setOnClickListener(view -> mFileUpload.launch("*/*"));
final ActivityResultLauncher<String> mFileUpload = registerForActivityResult(new ActivityResultContracts.GetContent(),
uri -> {
final Intent serviceIntent = new Intent(this, UploadFile.class);
final Bundle extrasService = new Bundle();
extrasService.putString("file", uri.toString());
serviceIntent.putExtras(extrasService);
ContextCompat.startForegroundService(this, serviceIntent);
});
错误:
2021-07-26 09:26:56.391 1558-13178/? E/ActivityManager: ANR in com.my.app (com.my.app/.Activities.UserAddActivity)
PID: 13090
Reason: Input dispatching timed out (1c8d463 com.my.app/com.my.app.Activities.UserAddActivity (server) is not responding. Waited 5003ms for FocusEvent(hasFocus=false))
Parent: com.my.app/.Activities.UserAddActivity
ANR 仅发生在大文件上。我正在测试的是63MB。奇怪的是文件确实传输到了可穿戴设备,但手机在完成之前就抛出了 ANR。
我什至尝试将代码放入Service
.
解决方案
推荐阅读
- vue-component - nuxt 类组件。异步获取不起作用
- python - Selenium 无法在 ::before ::after 内定位元素
- database - 二级索引和非聚集索引有什么区别
- node.js - 无法通过护照本地策略登录
- kubernetes - 在 Linode 上使用 PV
- javascript - 在 JS 中卡住排序和分隔嵌套数组
- javascript - 如何从浏览器控制台调用服务进行调试?
- html - 如何将新帖子添加到 swiper.js html
- node.js - 为什么我在使用查询参数时无法在 mongo db postman 中获取错误
- postgresql - R2DBC邻接列表获取所有孩子