Skip to content

Commit b8e723d

Browse files
committed
fixes few race-condition with runnable, and race-condition with lists in onNewIntent and onActivityResult. This changes are synchronized with latest pyjnius changes.
1 parent ce3e11f commit b8e723d

File tree

3 files changed

+38
-14
lines changed

3 files changed

+38
-14
lines changed

recipes/android/src/android/activity.py

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from jnius import PythonJavaClass, java_method, autoclass
1+
from jnius import PythonJavaClass, java_method, autoclass, cast
22

33
_activity = autoclass('org.renpy.android.PythonActivity').mActivity
44

@@ -10,14 +10,22 @@ class NewIntentListener(PythonJavaClass):
1010
__javainterfaces__ = ['org/renpy/android/PythonActivity$NewIntentListener']
1111
__javacontext__ = 'app'
1212

13-
def __init__(self, callback):
14-
super(NewIntentListener, self).__init__()
13+
def __init__(self, callback, **kwargs):
14+
super(NewIntentListener, self).__init__(**kwargs)
1515
self.callback = callback
1616

1717
@java_method('(Landroid/content/Intent;)V')
1818
def onNewIntent(self, intent):
1919
self.callback(intent)
2020

21+
@java_method('(Ljava/lang/Object;)Z')
22+
def equals(self, obj):
23+
return obj.hashCode() == self.hashCode()
24+
25+
@java_method('()I')
26+
def hashCode(self):
27+
return id(self)
28+
2129

2230
class ActivityResultListener(PythonJavaClass):
2331
__javainterfaces__ = ['org/renpy/android/PythonActivity$ActivityResultListener']
@@ -31,6 +39,14 @@ def __init__(self, callback):
3139
def onActivityResult(self, requestCode, resultCode, intent):
3240
self.callback(requestCode, resultCode, intent)
3341

42+
@java_method('(Ljava/lang/Object;)Z')
43+
def equals(self, obj):
44+
return obj.hashCode() == self.hashCode()
45+
46+
@java_method('()I')
47+
def hashCode(self):
48+
return id(self)
49+
3450

3551
def bind(**kwargs):
3652
for event, callback in kwargs.items():
@@ -51,7 +67,7 @@ def unbind(**kwargs):
5167
raise Exception('Unknown {!r} event'.format(event))
5268
else:
5369
for listener in _callbacks[event][:]:
54-
if listener.callback is callback:
70+
if listener.callback == callback:
5571
_callbacks[event].remove(listener)
5672
if event == 'on_new_intent':
5773
_activity.unregisterNewIntentListener(listener)

recipes/android/src/android/runnable.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ def __init__(self, func):
2525
def __call__(self, args, kwargs):
2626
self.args = args
2727
self.kwargs = kwargs
28-
_PythonActivity.mActivity.runOnUiThread(self)
2928
Runnable.__runnables__.append(self)
29+
_PythonActivity.mActivity.runOnUiThread(self)
3030

3131
@java_method('()V')
3232
def run(self):

src/src/org/renpy/android/PythonActivity.java

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@
2121
import java.io.FileWriter;
2222
import java.io.File;
2323
import java.io.IOException;
24-
import java.util.ArrayList;
24+
import java.util.Collections;
25+
import java.util.Iterator;
2526

2627
import java.util.zip.GZIPInputStream;
2728

@@ -380,11 +381,11 @@ public interface NewIntentListener {
380381
void onNewIntent(Intent intent);
381382
}
382383

383-
private ArrayList<NewIntentListener> newIntentListeners = null;
384+
private List<NewIntentListener> newIntentListeners = null;
384385

385386
public void registerNewIntentListener(NewIntentListener listener) {
386387
if ( this.newIntentListeners == null )
387-
this.newIntentListeners = new ArrayList<NewIntentListener>();
388+
this.newIntentListeners = Collections.synchronizedList(new ArrayList<NewIntentListener>());
388389
this.newIntentListeners.add(listener);
389390
}
390391

@@ -400,8 +401,12 @@ protected void onNewIntent(Intent intent) {
400401
return;
401402
if ( this.mView != null )
402403
this.mView.onResume();
403-
for ( NewIntentListener listener : this.newIntentListeners )
404-
listener.onNewIntent(intent);
404+
synchronized ( this.newIntentListeners ) {
405+
Iterator<NewIntentListener> iterator = this.newIntentListeners.iterator();
406+
while ( iterator.hasNext() ) {
407+
(iterator.next()).onNewIntent(intent);
408+
}
409+
}
405410
}
406411

407412
//----------------------------------------------------------------------------
@@ -412,11 +417,11 @@ public interface ActivityResultListener {
412417
void onActivityResult(int requestCode, int resultCode, Intent data);
413418
}
414419

415-
private ArrayList<ActivityResultListener> activityResultListeners = null;
420+
private List<ActivityResultListener> activityResultListeners = null;
416421

417422
public void registerActivityResultListener(ActivityResultListener listener) {
418423
if ( this.activityResultListeners == null )
419-
this.activityResultListeners = new ArrayList<ActivityResultListener>();
424+
this.activityResultListeners = Collections.synchronizedList(new ArrayList<ActivityResultListener>());
420425
this.activityResultListeners.add(listener);
421426
}
422427

@@ -432,8 +437,11 @@ protected void onActivityResult(int requestCode, int resultCode, Intent intent)
432437
return;
433438
if ( this.mView != null )
434439
this.mView.onResume();
435-
for ( ActivityResultListener listener : this.activityResultListeners )
436-
listener.onActivityResult(requestCode, resultCode, intent);
440+
synchronized ( this.activityResultListeners ) {
441+
Iterator<ActivityResultListener> iterator = this.activityResultListeners.iterator();
442+
while ( iterator.hasNext() )
443+
(iterator.next()).onActivityResult(requestCode, resultCode, intent);
444+
}
437445
}
438446

439447
//----------------------------------------------------------------------------

0 commit comments

Comments
 (0)