diff --git a/pythonforandroid/recipes/android/src/android/runnable.py b/pythonforandroid/recipes/android/src/android/runnable.py index 8d2d1161d1..8106a72709 100644 --- a/pythonforandroid/recipes/android/src/android/runnable.py +++ b/pythonforandroid/recipes/android/src/android/runnable.py @@ -7,9 +7,12 @@ from jnius import PythonJavaClass, java_method, autoclass from android.config import JAVA_NAMESPACE -# reference to the activity +# Reference to the activity _PythonActivity = autoclass(JAVA_NAMESPACE + '.PythonActivity') +# Cache of functions table. In older Android versions the number of JNI references +# is limited, so by caching them we avoid running out. +__functionstable__ = {} class Runnable(PythonJavaClass): '''Wrapper around Java Runnable class. This class can be used to schedule a @@ -27,6 +30,7 @@ def __call__(self, *args, **kwargs): self.args = args self.kwargs = kwargs Runnable.__runnables__.append(self) + _PythonActivity.mActivity.runOnUiThread(self) @java_method('()V') @@ -38,12 +42,24 @@ def run(self): traceback.print_exc() Runnable.__runnables__.remove(self) + + def run_on_ui_thread(f): '''Decorator to create automatically a :class:`Runnable` object with the function. The function will be delayed and call into the Activity thread. ''' + + if f not in __functionstable__: + + rfunction = Runnable(f) #store the runnable function + + __functionstable__[f] = {"rfunction":rfunction} + + rfunction = __functionstable__[f]["rfunction"] + def f2(*args, **kwargs): - Runnable(f)(*args, **kwargs) + rfunction(*args, **kwargs) + return f2