1515public class CRDBServiceAccessor {
1616 private final static String TAG = "cr3db" ;
1717 private Activity mActivity ;
18- private CRDBService .LocalBinder mService ;
19- private boolean mServiceBound ;
18+ private volatile CRDBService .LocalBinder mService ;
19+ private volatile boolean mServiceBound ;
2020 private MountPathCorrector pathCorrector ;
2121
2222 public CRDBService .LocalBinder get () {
@@ -30,7 +30,7 @@ public CRDBServiceAccessor(Activity activity, MountPathCorrector pathCorrector)
3030 this .pathCorrector = pathCorrector ;
3131 }
3232
33- public void setPathCorrector (MountPathCorrector pathCorrector ) {
33+ public synchronized void setPathCorrector (MountPathCorrector pathCorrector ) {
3434 this .pathCorrector = pathCorrector ;
3535 if (mService != null && pathCorrector != null )
3636 mService .setPathCorrector (pathCorrector );
@@ -40,15 +40,20 @@ public void setPathCorrector(MountPathCorrector pathCorrector) {
4040
4141 private boolean bindIsCalled ;
4242 public void bind (final Runnable boundCallback ) {
43- if (mService != null ) {
44- Log .v (TAG , "CRDBService is already bound" );
45- if (boundCallback != null )
46- boundCallback .run ();
47- return ;
48- }
43+ synchronized (this ) {
44+ if (mService != null ) {
45+ Log .v (TAG , "CRDBService is already bound" );
46+ if (boundCallback != null )
47+ boundCallback .run ();
48+ return ;
49+ }
50+ }
4951 //Log.v(TAG, "binding CRDBService");
50- if (boundCallback != null )
51- onConnectCallbacks .add (boundCallback );
52+ if (boundCallback != null ) {
53+ synchronized (onConnectCallbacks ) {
54+ onConnectCallbacks .add (boundCallback );
55+ }
56+ }
5257 if (!bindIsCalled ) {
5358 bindIsCalled = true ;
5459 if (mActivity .bindService (new Intent (mActivity ,
@@ -73,21 +78,27 @@ public void unbind() {
7378
7479 private ServiceConnection mServiceConnection = new ServiceConnection () {
7580 public void onServiceConnected (ComponentName className , IBinder service ) {
76- mService = ((CRDBService .LocalBinder )service );
77- Log .i (TAG , "connected to CRDBService" );
78- if (pathCorrector != null )
79- mService .setPathCorrector (pathCorrector );
80- if (onConnectCallbacks .size () != 0 ) {
81- // run once
82- for (Runnable callback : onConnectCallbacks )
83- callback .run ();
84- onConnectCallbacks .clear ();
85- }
81+ synchronized (CRDBServiceAccessor .this ) {
82+ mService = ((CRDBService .LocalBinder ) service );
83+ Log .i (TAG , "connected to CRDBService" );
84+ if (pathCorrector != null )
85+ mService .setPathCorrector (pathCorrector );
86+ }
87+ synchronized (onConnectCallbacks ) {
88+ if (onConnectCallbacks .size () != 0 ) {
89+ // run once
90+ for (Runnable callback : onConnectCallbacks )
91+ callback .run ();
92+ onConnectCallbacks .clear ();
93+ }
94+ }
8695 }
8796
8897 public void onServiceDisconnected (ComponentName className ) {
89- mService = null ;
90- Log .i (TAG , "disconnected from CRDBService" );
98+ synchronized (CRDBServiceAccessor .this ) {
99+ mService = null ;
100+ }
101+ Log .i (TAG , "disconnected from CRDBService" );
91102 }
92103 };
93104
0 commit comments