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

时间:2011-05-10 04:08:52

标签: 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)

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

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:-1)

我建议您将SharedPreference代码放在方法中并使用synchronized

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