Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

run_on_ui_thread crashes with local reference table overflow when called multiple times #164

Closed
b2ornot2b opened this issue Oct 21, 2013 · 5 comments

Comments

@b2ornot2b
Copy link

With the test program below, after ~250 iterations, it crashes with local reference table overflow. Program and logcat is attached.

main.py

#!/usr/bin/python

from android.runnable import run_on_ui_thread
import time

@run_on_ui_thread
def on_ui_thread():
    print 'On UI Thread'

def test_run_on_ui_thread():
    for i in range(10000):
        time.sleep(0.3)
        print 'Launching...', i
        on_ui_thread()

if __name__ == '__main__':
    test_run_on_ui_thread()

    while True:
        time.sleep(10)

Logcat:

I/python  (16512): Launching... 242
I/python  (16512): On UI Thread
I/python  (16512): Launching... 243
I/python  (16512): On UI Thread
I/python  (16512): Launching... 244
I/python  (16512): On UI Thread
I/python  (16512): Launching... 245
I/python  (16512): On UI Thread
I/python  (16512): Launching... 246
I/python  (16512): On UI Thread
I/python  (16512): Launching... 247
I/python  (16512): On UI Thread
I/python  (16512): Launching... 248
I/python  (16512): On UI Thread
I/python  (16512): Launching... 249
I/python  (16512): On UI Thread
I/python  (16512): Launching... 250
E/dalvikvm(16512): JNI ERROR (app bug): local reference table overflow (max=512)
W/dalvikvm(16512): JNI local reference table (0x66e0bbb0) dump:
W/dalvikvm(16512):   Last 10 entries (of 512):
W/dalvikvm(16512):       511: 0x40d711e8 java.lang.Class<java.lang.Class>
W/dalvikvm(16512):       510: 0x414c5df0 java.lang.Class<$Proxy0>
W/dalvikvm(16512):       509: 0x40d711e8 java.lang.Class<java.lang.Class>
W/dalvikvm(16512):       508: 0x40d72448 java.lang.Class<java.lang.Runnable>
W/dalvikvm(16512):       507: 0x40d711e8 java.lang.Class<java.lang.Class>
W/dalvikvm(16512):       506: 0x40d72448 java.lang.Class<java.lang.Runnable>
W/dalvikvm(16512):       505: 0x40d711e8 java.lang.Class<java.lang.Class>
W/dalvikvm(16512):       504: 0x40d72448 java.lang.Class<java.lang.Runnable>
W/dalvikvm(16512):       503: 0x40d711e8 java.lang.Class<java.lang.Class>
W/dalvikvm(16512):       502: 0x40d72448 java.lang.Class<java.lang.Runnable>
W/dalvikvm(16512):   Summary:
W/dalvikvm(16512):       510 of java.lang.Class (9 unique instances)
W/dalvikvm(16512):         1 of java.lang.Class[] (1 elements)
W/dalvikvm(16512):         1 of $Proxy0
E/dalvikvm(16512): Failed adding to JNI local ref table (has 512 entries)
I/dalvikvm(16512): "Thread-322" prio=5 tid=11 RUNNABLE
I/dalvikvm(16512):   | group="main" sCount=0 dsCount=0 obj=0x413b3968 self=0x670b0a58
I/dalvikvm(16512):   | sysTid=16529 nice=0 sched=0/0 cgrp=apps handle=1086339104
I/dalvikvm(16512):   | schedstat=( 1985623525 657106731 1722 ) utm=185 stm=13 core=1
I/dalvikvm(16512):   at org.renpy.android.SDLSurfaceView.nativeInit(Native Method)
I/dalvikvm(16512):   at org.renpy.android.SDLSurfaceView.run(SDLSurfaceView.java:660)
I/dalvikvm(16512):   at java.lang.Thread.run(Thread.java:856)
I/dalvikvm(16512): 
E/dalvikvm(16512): VM aborting
F/libc    (16512): Fatal signal 11 (SIGSEGV) at 0xdeadd00d (code=1), thread 16529 (Thread-322)
I/DEBUG   (   92): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG   (   92): Build fingerprint: 'rk30sdk/rk30sdk/rk30sdk:4.1.1/JRO03H/eng.gyq.20130703.173631:eng/release-keys'
I/DEBUG   (   92): pid: 16512, tid: 16529, name: Thread-322  >>> org.inbe.paisool:python <<<
I/DEBUG   (   92): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadd00d
I/DEBUG   (   92):     r0 00000000  r1 00000000  r2 deadd00d  r3 00000000
I/DEBUG   (   92):     r4 407df1a8  r5 0000020c  r6 670b0a58  r7 670b0b00
I/DEBUG   (   92):     r8 407c0c39  r9 414c5df0  sl 61fdf6b0  fp 00000c54
I/DEBUG   (   92):     ip 00004000  sp 691d4fe0  lr 4005aa01  pc 4077add0  cpsr 68000030
I/DEBUG   (   92):     d0  706e65722e67726f  d1  696f72646e612e79
I/DEBUG   (   92):     d2  7275534c44532e64  d3  7765695665636166
I/DEBUG   (   92):     d4  0000000000000000  d5  000002ef000004ff
I/DEBUG   (   92):     d6  0000000044a00000  d7  00eff10000000000
I/DEBUG   (   92):     d8  0000000000000000  d9  0000000000000000
I/DEBUG   (   92):     d10 0000000000000000  d11 0000000000000000
I/DEBUG   (   92):     d12 0000000000000000  d13 0000000000000000
I/DEBUG   (   92):     d14 0000000000000000  d15 0000000000000000
I/DEBUG   (   92):     d16 0000000000000000  d17 7e37e43c8800759c
I/DEBUG   (   92):     d18 0000000006000000  d19 000000e1000000df
I/DEBUG   (   92):     d20 fffffff0fffffff0  d21 ffa54dd2ffa604a4
I/DEBUG   (   92):     d22 ffd4cb1affd52334  d23 000166e9000166e9
I/DEBUG   (   92):     d24 0001c5a20001c5a2  d25 ffff492effff492e
I/DEBUG   (   92):     d26 ffffa7e6ffffa7e6  d27 0000000200000002
I/DEBUG   (   92):     d28 000000a4000000a3  d29 000000cf000000ce
I/DEBUG   (   92):     d30 000000cc000000ca  d31 000000a1000000a0
I/DEBUG   (   92):     scr 20000010
I/DEBUG   (   92): 
I/DEBUG   (   92): backtrace:
I/DEBUG   (   92):     #00  pc 00045dd0  /system/lib/libdvm.so (dvmAbort+75)
I/DEBUG   (   92):     #01  pc 00048a2d  /system/lib/libdvm.so
I/DEBUG   (   92):     #02  pc 0004c833  /system/lib/libdvm.so
I/DEBUG   (   92):     #03  pc 00040f5d  /system/lib/libdvm.so
I/DEBUG   (   92):     #04  pc 0019e49c  /data/data/org.inbe.paisool/files/libpymodules.so
I/DEBUG   (   92): 
I/DEBUG   (   92): stack:
I/DEBUG   (   92):          691d4fa0  00000001  
I/DEBUG   (   92):          691d4fa4  40089d44  
I/DEBUG   (   92):          691d4fa8  40089d44  
I/DEBUG   (   92):          691d4fac  40089d44  
I/DEBUG   (   92):          691d4fb0  40089d44  
I/DEBUG   (   92):          691d4fb4  4005aa01  /system/lib/libc.so (__sflush_locked+36)
I/DEBUG   (   92):          691d4fb8  40084754  /system/lib/libc.so
I/DEBUG   (   92):          691d4fbc  40089d44  
I/DEBUG   (   92):          691d4fc0  00000000  
I/DEBUG   (   92):          691d4fc4  4005b9d1  /system/lib/libc.so (_fwalk+32)
I/DEBUG   (   92):          691d4fc8  407df1a8  /system/lib/libdvm.so
I/DEBUG   (   92):          691d4fcc  0000020c  
I/DEBUG   (   92):          691d4fd0  670b0a58  
I/DEBUG   (   92):          691d4fd4  670b0b00  
I/DEBUG   (   92):          691d4fd8  df0027ad  
I/DEBUG   (   92):          691d4fdc  00000000  
I/DEBUG   (   92):     #00  691d4fe0  00000000  
I/DEBUG   (   92):          691d4fe4  6c756e28  
I/DEBUG   (   92):          691d4fe8  0000296c  
I/DEBUG   (   92):          691d4fec  00000000  
I/DEBUG   (   92):          691d4ff0  00000000  
I/DEBUG   (   92):          691d4ff4  00000000  
I/DEBUG   (   92):          691d4ff8  00000000  
I/DEBUG   (   92):          691d4ffc  00000000  
I/DEBUG   (   92):          691d5000  00000000  
I/DEBUG   (   92):          691d5004  00000000  
I/DEBUG   (   92):          691d5008  00000000  
I/DEBUG   (   92):          691d500c  00000000  
I/DEBUG   (   92):          691d5010  00000000  
I/DEBUG   (   92):          691d5014  00000000  
I/DEBUG   (   92):          691d5018  00000000  
I/DEBUG   (   92):          691d501c  00000000  
I/DEBUG   (   92):          ........  ........
I/DEBUG   (   92):     #01  691d51f8  00000000  
I/DEBUG   (   92):          691d51fc  414c5df0  /dev/ashmem/dalvik-heap (deleted)
I/DEBUG   (   92):          691d5200  61fdf6b0  /dev/ashmem/dalvik-LinearAlloc (deleted)
I/DEBUG   (   92):          691d5204  672d8ac0  
I/DEBUG   (   92):          691d5208  691d5284  
I/DEBUG   (   92):          691d520c  40781837  /system/lib/libdvm.so
I/DEBUG   (   92):     #02  691d5210  691d5220  
I/DEBUG   (   92):          691d5214  691d5284  
I/DEBUG   (   92):          691d5218  691d524c  
I/DEBUG   (   92):          691d521c  670b0a58  
I/DEBUG   (   92):          691d5220  414c6090  /dev/ashmem/dalvik-heap (deleted)
I/DEBUG   (   92):          691d5224  00000000  
I/DEBUG   (   92):          691d5228  61fdf6b0  /dev/ashmem/dalvik-LinearAlloc (deleted)
I/DEBUG   (   92):          691d522c  00000000  
I/DEBUG   (   92):          691d5230  691d5284  
I/DEBUG   (   92):          691d5234  672d8ac0  
I/DEBUG   (   92):          691d5238  407817f1  /system/lib/libdvm.so
I/DEBUG   (   92):          691d523c  40775f5f  /system/lib/libdvm.so
I/DEBUG   (   92): 
I/DEBUG   (   92): memory near r4:
I/DEBUG   (   92):     407df188 00000000 00000000 00000000 00000000  ................
I/DEBUG   (   92):     407df198 00000000 00000000 00000000 00000000  ................
I/DEBUG   (   92):     407df1a8 40d0c7c0 40b48fd0 00800000 18000000  ...@...@........
I/DEBUG   (   92):     407df1b8 04000000 00004000 00006000 00000001  .....@...`......
I/DEBUG   (   92):     407df1c8 00000101 00000002 00000001 00000000  ................
I/DEBUG   (   92): 
I/DEBUG   (   92): memory near r6:
I/DEBUG   (   92):     670b0a38 64bbcc82 64bbcc76 00000020 00000013  ...dv..d .......
I/DEBUG   (   92):     670b0a48 00000001 00000000 66e06b30 00000453  ........0k.fS...
I/DEBUG   (   92):     670b0a58 63292998 40c09f6c 62286b08 40b83000  .))cl..@.k(b.0.@
I/DEBUG   (   92):     670b0a68 00000000 00000000 691d5da8 00000000  .........].i....
I/DEBUG   (   92):     670b0a78 691d5ddc 0000000b 00000000 40752fc0  .].i........./u@
I/DEBUG   (   92): 
I/DEBUG   (   92): memory near r7:
I/DEBUG   (   92):     670b0ae0 00000000 00000000 00000000 00000000  ................
I/DEBUG   (   92):     670b0af0 00001ffa 407df724 40d863b0 61fde0b8  ....$.}@.c.@...a
I/DEBUG   (   92):     670b0b00 00000200 66e0a7a0 00000001 00000200  .......f........
I/DEBUG   (   92):     670b0b10 00000200 00000004 00000002 63312f0a  ............./1c
I/DEBUG   (   92):     670b0b20 63312f10 00000001 6326b274 620a3e90  ./1c....t.&c.>.b
I/DEBUG   (   92): 
I/DEBUG   (   92): memory near r8:
I/DEBUG   (   92):     407c0c18 64612072 73657264 25282073 6f202970  r address (%p) o
I/DEBUG   (   92):     407c0c28 61632072 69636170 28207974 29646c25  r capacity (%ld)
I/DEBUG   (   92):     407c0c38 45004c00 56006200 70734500 494e4a00  .L.E.b.V.Esp.JNI
I/DEBUG   (   92):     407c0c48 6166203a 64656c69 61756720 64656472  : failed guarded
I/DEBUG   (   92):     407c0c58 706f6320 68632079 206b6365 52206e69   copy check in R
I/DEBUG   (   92): 
I/DEBUG   (   92): memory near r9:
I/DEBUG   (   92):     414c5dd0 40d720b8 00000000 414c5d58 00000000  . .@....X]LA....
I/DEBUG   (   92):     414c5de0 00000000 00000007 00000000 000000c3  ................
I/DEBUG   (   92):     414c5df0 40d711e8 00000000 414c6090 00000000  ...@.....`LA....
I/DEBUG   (   92):     414c5e00 00000000 00000000 630250f0 630250f0  .........P.c.P.c
I/DEBUG   (   92):     414c5e10 00020011 50000a16 00000000 00000007  .......P........
I/DEBUG   (   92): 
I/DEBUG   (   92): memory near sl:
I/DEBUG   (   92):     61fdf690 00000030 633d7be6 6328c3f4 00000000  0....{=c..(c....
I/DEBUG   (   92):     61fdf6a0 00000000 00000000 634e892c 00000000  ........,.Nc....
I/DEBUG   (   92):     61fdf6b0 40d711e8 00000001 0002002c 00010001  ...@....,.......
I/DEBUG   (   92):     61fdf6c0 6341b4d8 61efdd58 000002ed 633dae70  ..AcX..a....p.=c
I/DEBUG   (   92):     61fdf6d0 6328c410 00000000 00000000 00000000  ..(c............
I/DEBUG   (   92): 
I/DEBUG   (   92): memory near ip:
I/DEBUG   (   92):     00003fe0 ffffffff ffffffff ffffffff ffffffff  ................
I/DEBUG   (   92):     00003ff0 ffffffff ffffffff ffffffff ffffffff  ................
I/DEBUG   (   92):     00004000 ffffffff ffffffff ffffffff ffffffff  ................
I/DEBUG   (   92):     00004010 ffffffff ffffffff ffffffff ffffffff  ................
I/DEBUG   (   92):     00004020 ffffffff ffffffff ffffffff ffffffff  ................
I/DEBUG   (   92): 
I/DEBUG   (   92): memory near sp:
I/DEBUG   (   92):     691d4fc0 00000000 4005b9d1 407df1a8 0000020c  .......@..}@....
I/DEBUG   (   92):     691d4fd0 670b0a58 670b0b00 df0027ad 00000000  X..g...g.'......
I/DEBUG   (   92):     691d4fe0 00000000 6c756e28 0000296c 00000000  ....(null)......
I/DEBUG   (   92):     691d4ff0 00000000 00000000 00000000 00000000  ................
I/DEBUG   (   92):     691d5000 00000000 00000000 00000000 00000000  ................
I/DEBUG   (   92): 
I/DEBUG   (   92): code around pc:
I/DEBUG   (   92):     4077adb0 34bcf8d3 ecc2f7d7 461d2300 b1525d1a  ...4.....#.F.]R.
I/DEBUG   (   92):     4077adc0 18ad3301 7f00f5b3 e004d1f8 4a0a4798  .3...........G.J
I/DEBUG   (   92):     4077add0 f7d77015 490cecba 4a0c2006 44794c0c  .p.....I. .J.LyD
I/DEBUG   (   92):     4077ade0 447c447a eb6cf7d7 f7d72000 6ca3ec12  zD|D..l.. .....l
I/DEBUG   (   92):     4077adf0 d1eb2b00 bf00e7eb deadd00d 0005fd7c  .+..........|...
I/DEBUG   (   92): 
I/DEBUG   (   92): code around lr:
I/DEBUG   (   92):     4005a9e0 447e4e08 68336836 f000b10b 4620fa4c  .N~D6h3h....L. F
I/DEBUG   (   92):     4005a9f0 ffcaf7ff 68304605 4620b110 fa50f000  .....F0h.. F..P.
I/DEBUG   (   92):     4005aa00 bd704628 00029aa2 4604b570 4811b928  (Fp.....p..F(..H
I/DEBUG   (   92):     4005aa10 e8bd4478 f0004070 4e0fbfcb 6836447e  xD..p@.....N~D6h
I/DEBUG   (   92):     4005aa20 b10b6833 fa2ff000 f01089a0 d1060f18  3h..../.........
I/DEBUG   (   92): 
I/DEBUG   (   92): memory map around fault addr deadd00d:
I/DEBUG   (   92):     be85d000-be87e000 [stack]
I/DEBUG   (   92):     (no map for address)
I/DEBUG   (   92):     ffff0000-ffff1000 [vectors]
I/BootReceiver( 8645): Copying /data/tombstones/tombstone_02 to DropBox (SYSTEM_TOMBSTONE)
W/InputDispatcher( 8645): channel '4174cc78 org.inbe.paisool/org.renpy.android.PythonActivity (server)' ~ Consumer closed input channel or an error occurred.  events=0x9
E/InputDispatcher( 8645): channel '4174cc78 org.inbe.paisool/org.renpy.android.PythonActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
D/Zygote  ( 8625): Process 16512 terminated by signal (11)
W/InputDispatcher( 8645): Attempted to unregister already unregistered input channel '4174cc78 org.inbe.paisool/org.renpy.android.PythonActivity (server)'
I/WindowManager( 8645): WINDOW DIED Window{4174cc78 org.inbe.paisool/org.renpy.android.PythonActivity paused=false}
I/ActivityManager( 8645): Process org.inbe.paisool:python (pid 16512) has died.
W/WindowManager( 8645): Force-removing child win Window{41876be0 SurfaceView paused=false} from container Window{4174cc78 org.inbe.paisool/org.renpy.android.PythonActivity paused=false}
W/ActivityManager( 8645): Force removing ActivityRecord{41835bd8 org.inbe.paisool/org.renpy.android.PythonActivity}: app died, no saved state
E/SharedPreferencesImpl( 8645): Couldn't create directory for SharedPreferences file /data/user/0/android/shared_prefs/log_files.xml
W/WindowManager( 8645): Failed looking up window
W/WindowManager( 8645): java.lang.IllegalArgumentException: Requested window android.os.BinderProxy@418a8328 does not exist
W/WindowManager( 8645):     at com.android.server.wm.WindowManagerService.windowForClientLocked(WindowManagerService.java:7773)
W/WindowManager( 8645):     at com.android.server.wm.WindowManagerService.windowForClientLocked(WindowManagerService.java:7764)
W/WindowManager( 8645):     at com.android.server.wm.WindowState$DeathRecipient.binderDied(WindowState.java:854)
W/WindowManager( 8645):     at android.os.BinderProxy.sendDeathNotice(Binder.java:449)
W/WindowManager( 8645):     at dalvik.system.NativeStart.run(Native Method)
I/WindowState( 8645): WIN DEATH: null
D/dalvikvm( 8645): GC_CONCURRENT freed 726K, 18% free 11284K/13639K, paused 12ms+3ms, total 57ms

Want to back this issue? Post a bounty on it! We accept bounties via Bountysource.

@tito
Copy link
Member

tito commented Oct 29, 2013

I've hit the same issues few days ago, but reported it in the wrong project: kivy/pyjnius#83

@gordianknotC
Copy link

following coded crashed too

class Test (PythonJavaClass):
    __javacontext__ = 'app'
    __javainterfaces__ = ['android/view/View$OnDragListener']

    def __init__ (self):
        super (Test, self).__init__ ()

# reference overflow
for i in range(256):
    test = Test()

# reference overflow
for i in range(256):
    test = Test()
    del test

seems any interface implementation instantiated more than 25X times at once would cause reference overflow!

@marccardinal
Copy link

This kivy code also produces the JNI ERROR (app bug): local reference table overflow (max=512) error:

class MyApp(App):
    tickCount = 0

    def build(self):
        Clock.schedule_interval(self.Tick, 1)

    def Tick(self):
        self.GetMyLocation()

    @run_on_ui_thread
    def GetMyLocation(self):
        self.tickCount += 1
        print "Tick: %s" % self.tickCount

Which gives me the error:

E/dalvikvm(31475): JNI ERROR (app bug): local reference table overflow (max=512)
W/dalvikvm(31475): JNI local reference table (0x832f9f28) dump:
W/dalvikvm(31475):   Last 10 entries (of 512):
W/dalvikvm(31475):       511: 0x415ee1e8 java.lang.Class<java.lang.Class>
W/dalvikvm(31475):       510: 0x41ce1f60 java.lang.Class<$Proxy3>
W/dalvikvm(31475):       509: 0x41cdf798 $Proxy3
W/dalvikvm(31475):       508: 0x428f36f0 java.lang.Class[] (1 elements)
W/dalvikvm(31475):       507: 0x415ee1e8 java.lang.Class<java.lang.Class>
W/dalvikvm(31475):       506: 0x415ef488 java.lang.Class<java.lang.Runnable>
W/dalvikvm(31475):       505: 0x415ee1e8 java.lang.Class<java.lang.Class>
W/dalvikvm(31475):       504: 0x415ef488 java.lang.Class<java.lang.Runnable>
W/dalvikvm(31475):       503: 0x415ee1e8 java.lang.Class<java.lang.Class>
W/dalvikvm(31475):       502: 0x415ef488 java.lang.Class<java.lang.Runnable>
W/dalvikvm(31475):   Summary:
W/dalvikvm(31475):       510 of java.lang.Class (52 unique instances)
W/dalvikvm(31475):         1 of java.lang.Class[] (1 elements)
W/dalvikvm(31475):         1 of $Proxy3
E/dalvikvm(31475): Failed adding to JNI local ref table (has 512 entries)
I/dalvikvm(31475): "Thread-328758" prio=5 tid=12 RUNNABLE
I/dalvikvm(31475):   | group="main" sCount=0 dsCount=0 obj=0x41a92b48 self=0x7a52b700
I/dalvikvm(31475):   | sysTid=31515 nice=0 sched=0/0 cgrp=apps handle=2052242264
I/dalvikvm(31475):   | state=R schedstat=( 0 0 0 ) utm=1727 stm=134 core=3
I/dalvikvm(31475):   at org.renpy.android.SDLSurfaceView.nativeInit(Native Method)
I/dalvikvm(31475):   at org.renpy.android.SDLSurfaceView.run(SDLSurfaceView.java:726)
I/dalvikvm(31475):   at java.lang.Thread.run(Thread.java:864)
I/dalvikvm(31475): 
E/dalvikvm(31475): VM aborting
F/libc    (31475): Fatal signal 6 (SIGABRT) at 0x00007af3 (code=-6), thread 31515 (Thread-328758)

In my use case I have a google map widget in the ui thread and a timer to periodically poll the user location. Is there a work around?

@marccardinal
Copy link

Has someone found a workaround? Some calls need to be made in the ui thread and running a function decorated with @run_in_ui_thread leaks very quickly.

@oukiar
Copy link
Contributor

oukiar commented May 31, 2019

This is a workaround solution for this problem.

I found that every call to any function decorated with @run_in_ui_thread creates a new entry in the table of jni references, even if the call is for the same function multiple times.

The solution is keep a dictionary with all the functions called, and reused instead of create a Runnable in every @run_in_ui_thread call.

I think this solution is only usefull for call a limited number of different functions, maximum 490 functions approximately.

The changes must be made to the file:
python-for-android/pythonforandroid/recipes/android/src/android/runnable.py

And the complete new changes are:

#start file

'''
Runnable
========

'''

from jnius import PythonJavaClass, java_method, autoclass
from android.config import JAVA_NAMESPACE

# reference to the activity
_PythonActivity = autoclass(JAVA_NAMESPACE + '.PythonActivity')

#cache of functions table
__functionstable__ = {}

class Runnable(PythonJavaClass):
    '''Wrapper around Java Runnable class. This class can be used to schedule a
    call of a Python function into the PythonActivity thread.
    '''

    __javainterfaces__ = ['java/lang/Runnable']
    __runnables__ = []

    def __init__(self, func):
        super(Runnable, self).__init__()
        self.func = func

    def __call__(self, *args, **kwargs):
        self.args = args
        self.kwargs = kwargs
        Runnable.__runnables__.append(self)
        
        _PythonActivity.mActivity.runOnUiThread(self)

    @java_method('()V')
    def run(self):
        try:
            self.func(*self.args, **self.kwargs)
        except:  # noqa E722
            import traceback
            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):
        rfunction(*args, **kwargs)
            
    return f2

#endfile

and this is the pull request #1830

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

6 participants