我在名为Remote的类中同步静态方法,这些类从服务调用以从网络获取数据。该服务是一个IntentService,每当用户向下滚动UI中的列表并且需要获取更多项目时,它就会启动。这些方法是同步的,因为它们也是从另一个源,即同步吸收器调用的。在Remote中对同一方法的两次调用不能交错。但是由于我的syncadapter运行在一个单独的进程上,使得方法同步并不会强制执行线程安全,而且我的状态也不一致。
我通过将syncadapter切换回在主进程中运行来解决这个问题。更具体地说,从syncservice中删除android:process
值。但我想知道是否有更强大的做法,无论同步播放器的位置如何,都可以使用。
答案 0 :(得分:1)
有几点:
您可以将所有与网络相关的代码放在一个IntentService中,并从不同的地方发送它的意图,将任务详细信息作为附加内容传递。 IntentService将按顺序处理这些意图;
在一个过程中,您可以使用FutureTask [1]或Volley的RequestFuture<> [2]类来同步您的网络请求。
[1]查看如何使用FutureTask阻止重新启动相同操作的示例:http://jcip.net/listings/Memoizer3.java
[2]在此处查看示例:Can I do a synchronous request with volley?
答案 1 :(得分:0)
我不是Android开发人员,但我认为您可能会在进程和线程之间感到困惑。
进程具有自包含的执行环境。进程通常具有完整的私有基本运行时资源集;特别是,每个进程都有自己的内存空间。 source
当您将SyncAdapter作为进程启动时,它不知道正在使用相同同步块的其他进程(或其线程),并且每个进程都会在自己的内存空间中获得锁定。
我认为您应该将SyncAdapter作为主进程中的线程启动,因为这样线程将阻塞,而另一个则在同步块中。