我正在使用Android SyncAdapter和域驱动设计(DDD)功能开发多进程解决方案。
登录后,需要下载一些数据才能继续。然后我手动启动SyncAdapter并(意图)await ultil结束。
SyncAdapter在不同的进程中运行,我需要在同步结束之前显示用户未确定的进度。之后,我关闭了进度,生命继续奇妙......但是!!!
在同步过程中,我创建了一个文件,以便通知其他进程正在进行处理:
@Override
public Locker lock(String lockerName) {
final File file = context.getFileStreamPath(lockerName);
try {
final RandomAccessFile lockFile = new RandomAccessFile(file, "rws");
final FileLock fileLock = lockFile.getChannel().lock();
...
好的,这非常有效...... 在应用程序进程中,在验证线程(RxJava Interval)中我这样做:
@Override
public boolean isLocked(String lockerName) {
final File file = context.getFileStreamPath(lockerName);
try {
final RandomAccessFile lockFile = new RandomAccessFile(file, "rws");
final FileLock fileLock = lockFile.getChannel().tryLock();
boolean result = fileLock == null;
...
我得到以下结果/异常:
java.io.IOException:fcntl失败:EAGAIN(再试一次) 在java.nio.FileChannelImpl.basicLock(FileChannelImpl.java:123) 在java.nio.FileChannelImpl.tryLock(FileChannelImpl.java:181) 在java.nio.channels.FileChannel.tryLock(FileChannel.java:584) 在ch4k4uw.easysale.domain.service.SimpleInterProcessSyncAccessDomainService.isLocked(SimpleInterProcessSyncAccessDomainService.java:69)
...
android.system.ErrnoException:fcntl失败:EAGAIN(再试一次) at libcore.io.Posix.fcntlFlock(Native Method) 在libcore.io.ForwardingOs.fcntlFlock(ForwardingOs.java:70) 在java.nio.FileChannelImpl.basicLock(FileChannelImpl.java:121) 在java.nio.FileChannelImpl.tryLock(FileChannelImpl.java:181) 在java.nio.channels.FileChannel.tryLock(FileChannel.java:584) 在ch4k4uw.easysale.domain.service.SimpleInterProcessSyncAccessDomainService.isLocked(SimpleInterProcessSyncAccessDomainService.java:69)
如果锁定失败,FileLock::tryLock()是否应返回null?
我做错了吗?有没有其他方法可以在不使用Android服务的情况下按照DDD概念进行这种进程间通信?
感谢。
PS: 我正在使用三星Galaxy J7 METAL设备进行测试。