2011-05-10 70 views
0

我的应用程序有一个活动,一个服务和几个事件接收器。Java或Android中不同线程/进程之间的同步?

他们似乎受不同的进程或线程控制,所以我必须找出一种方法来同步我的全局变量。

我使用的方法是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) 

我不确定我的活动,服务或接收器是由不同的进程控制的,还是由同一进程中的不同线程控制。

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

感谢您的任何回应或建议。

回答

-1

我会建议把你的SharedPreference代码的方法和使用​​

synchronized private void foo() 
{ 
     //Do something 
} 
+1

谢谢。它是否也适用于不同的流程?因为我不确定我的活动,服务和接收者是否会在同一个过程中。 – dong221 2011-05-10 07:45:18

+0

是的,只是给它一个镜头..并检查你自己 – ingsaurabh 2011-05-10 07:46:15

+0

@ingsaurabh,我读过'synchronized'只适用于多线程而不是进程。 – Sam 2015-06-13 03:42:54

0

SharedPreferences文档说,它目前不支持跨多个过程中使用。只有在处理多个线程而不是多个进程时,同步才是一种解决方案。为了安全地访问多个进程,您需要创建一个ServiceContentProvider