簡體   English   中英

Java或Android中不同線程/進程之間的同步?

[英]Synchronization between different threads/processes in Java or 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)

我不確定我的活動,服務或接收者是由不同進程控制的,還是由同一進程中的不同線程控制的。

因此,我認為我可能需要全局互斥鎖,以避免那些進程/線程同時讀取/寫入共享首選項。

感謝您的任何答復或建議。

SharedPreferences的文檔說,它當前不支持跨多個進程的使用。 僅當您處理多個線程而不是多個進程時,同步才是解決方案。 為了通過多個進程進行安全訪問,您需要創建ServiceContentProvider

我建議將您的SharedPreference代碼放在一種方法中,並使用synchronized

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM