public void invoke(final Runnable runnable, final Object lock, final boolean wait) { if(NSThread.isMainThread()) { if(log.isDebugEnabled()) { log.debug(String.format("Already on main thread. Invoke %s directly.", runnable)); } runnable.run(); return; } synchronized(lock) { if(log.isTraceEnabled()) { log.trace(String.format("Invoke runnable %s on main thread", runnable)); } try { //Defer to main thread Foundation.runOnMainThread(runnable, wait); } catch(Exception e) { log.error(String.format("Exception %s running task on main thread", e.getMessage()), e); } } } }
public ObjCObjectInvocationHandler(final ID ocInstance, Class<? extends ObjCObject> javaClass, boolean retain) { this.ocInstance = ocInstance; javaClassName = javaClass.getSimpleName(); invokeAllMethodsOnMainThread = shouldInvokeMethodsOnMainThread(javaClass); releaseOnFinalize = shouldReleaseInFinalize(javaClass); if (logging.isTraceEnabled()) { int retainCount = Foundation.cfGetRetainCount(ocInstance); logging.trace("Creating NSObjectInvocationHandler for id {}, javaclass {}. retain = {}, retainCount = {}", new Object[] {ocInstance, javaClass, retain, retainCount}); } if (ocInstance.isNull()) { throw new NullPointerException(); } if (retain) { if (callAcrossToMainThread()) { Foundation.runOnMainThread(new Runnable() { public void run() { Foundation.cfRetain(ocInstance); }}); } else { Foundation.cfRetain(ocInstance); } } }
@Override protected void finalize() throws Throwable { if (finalized || !releaseOnFinalize) return; try { if (callAcrossToMainThread()) { Foundation.runOnMainThread(new Runnable() { public void run() { release(); }}); } else { AutoreleaseBatcher autoreleaseBatcher = AutoreleaseBatcher.forThread(FINALIZE_AUTORELEASE_BATCH_SIZE); release(); autoreleaseBatcher.operate(); } super.finalize(); } finally { finalized = true; } }