Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.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 - Fatal编程技术网

Java或Android中不同线程/进程之间的同步?

Java或Android中不同线程/进程之间的同步?,java,android,Java,Android,我的应用程序有一个活动、一个服务和几个事件接收器 它们似乎由不同的进程或线程控制,因此我必须找到一种方法来同步全局变量 我使用的方法是android中的共享首选项,它提供了一种在简单数据库中存储/读取信息的方法 但是,我发现可能存在同步问题,因为不同的进程/线程可能同时读取/写入共享首选项 当我收到一些事件时,可能会导致以下ANR应用程序没有响应问题 DALVIK THREADS: "main" prio=5 tid=1 NATIVE | group="main" sCount=1 dsCo

我的应用程序有一个活动、一个服务和几个事件接收器

它们似乎由不同的进程或线程控制,因此我必须找到一种方法来同步全局变量

我使用的方法是android中的共享首选项,它提供了一种在简单数据库中存储/读取信息的方法

但是,我发现可能存在同步问题,因为不同的进程/线程可能同时读取/写入共享首选项

当我收到一些事件时,可能会导致以下ANR应用程序没有响应问题

DALVIK THREADS: "main" prio=5 tid=1 NATIVE | group="main" sCount=1 dsCount=0 s=N obj=0x4001d8b0 self=0xcd30 | sysTid=4899 nice=0 sched=0/0 cgrp=default handle=-1345017808 | schedstat=( 1374573162 1397685629 3862 ) at org.apache.harmony.luni.platform.OSFileSystem.openImpl(Native Method) at org.apache.harmony.luni.platform.OSFileSystem.open(OSFileSystem.java:152) at java.io.FileOutputStream.(FileOutputStream.java:97) at java.io.FileOutputStream.(FileOutputStream.java:69) at android.app.ContextImpl$SharedPreferencesImpl.createFileOutputStream(ContextImpl.java:3034) at android.app.ContextImpl$SharedPreferencesImpl.writeFileLocked(ContextImpl.java:3094) at android.app.ContextImpl$SharedPreferencesImpl.access$300(ContextImpl.java:2824) at android.app.ContextImpl$SharedPreferencesImpl$EditorImpl.commit(ContextImpl.java:3009) at com.test.myapp.myapp.c((null):-1) at com.test.myapp.myapp.a((null):-1) at com.test.myapp.EventNetwork.onReceive((null):-1) at android.app.ActivityThread.handleReceiver(ActivityThread.java:2810) at android.app.ActivityThread.access$3200(ActivityThread.java:125) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2083) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:123) at android.app.ActivityThread.main(ActivityThread.java:4627) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:521) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) at dalvik.system.NativeStart.main(Native Method) 我不确定我的活动、服务或接收者是否由不同的进程控制,或者同一进程中的不同线程控制

因此,我认为我可能需要一个全局互斥来避免那些进程/线程同时读取/写入共享首选项


感谢您的回复或建议。

我建议将您的SharedReference代码放入一个方法中并使用synchronized


SharedReferences的文档说,它目前不支持跨多个进程使用。只有在处理多个线程而不是多个进程时,同步才是一种解决方案。要通过多个进程安全访问,您需要创建服务或内容提供商。

谢谢。它是否也适用于不同的流程?因为我不确定我的活动、服务和接收者是否会在同一个进程中。@ingsarabh,我已经读到synchronized只适用于多个线程而不是进程。
synchronized private void foo()
{
      //Do something
}