Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java android跨进程同步方法_Java_Android_Multithreading - Fatal编程技术网

Java android跨进程同步方法

Java android跨进程同步方法,java,android,multithreading,Java,Android,Multithreading,我在一个名为Remote的类中同步了静态方法,该类从服务中调用以从网络中获取数据。该服务是一个IntentService,每当用户在UI中向下滚动列表并且需要获取更多项目时,就会启动该服务。这些方法是同步的,因为它们也是从另一个源syncadapter调用的。远程中对同一方法的两个调用不能交错。但是,由于我的syncadapter运行在一个单独的进程上,使方法同步并没有强制执行线程安全,因此我得到了不一致的状态 我通过将syncadapter切换回在主进程中运行来解决这个问题。更具体地说,从sy

我在一个名为Remote的类中同步了静态方法,该类从服务中调用以从网络中获取数据。该服务是一个IntentService,每当用户在UI中向下滚动列表并且需要获取更多项目时,就会启动该服务。这些方法是同步的,因为它们也是从另一个源syncadapter调用的。远程中对同一方法的两个调用不能交错。但是,由于我的syncadapter运行在一个单独的进程上,使方法同步并没有强制执行线程安全,因此我得到了不一致的状态


我通过将syncadapter切换回在主进程中运行来解决这个问题。更具体地说,从syncservice中删除
android:process
值。但是我想知道是否有一种更为健壮的方法,不管syncadapter位于何处都可以使用。

我不是Android开发人员,但我认为您可能会对进程和线程感到困惑

流程具有自包含的执行环境。一个进程通常有一组完整的、私有的基本运行时资源;特别是,每个进程都有自己的内存空间

当您将SyncAdapter作为进程启动时,它不知道使用相同同步块的其他进程(或其线程),并且每个进程都将在其自己的内存空间中获得一个锁

我认为您应该将SyncAdapter作为主进程中的线程启动,因为这样一来,线程将阻塞,而另一个线程处于同步块中。

有几点:

  • 您可以将所有与网络相关的代码放在一个IntentService中,并从不同的地方发送intent,将任务详细信息作为额外信息传递。IntentService将按顺序处理这些意图

  • 在流程中,您可以使用FutureTask[1]或Volley的RequestFuture[2]类来同步网络请求

[1] 请参阅如何使用FutureTask防止重新启动相同操作的示例:


[2] 请参阅此处的示例:

我对SyncAdapter没有太多介绍,但是您是否可以“强制”SyncAdapter同步,而不是调用synchronized方法?是的,但逻辑不同。在syncadapter中,我调用了3或4个同步方法,但当通过服务路由调用它们时,一次只调用其中一个。