void onLogMessageReceived(string message, string stackTrace, LogType type) { foreach (var instance in current) { ASync.OnMainThread(() => { var entry = instance.view.logEntryPrefab.clone(); var shortText = $"{DateTime.Now} {type} {message}"; entry.text = shortText; entry.GetComponent <RectTransform>().SetParent( instance.view.logEntriesHolder.transform, worldPositionStays: false ); entry.transform.SetAsFirstSibling(); }); } }
public static void registerToUnity(OnError onError, bool logWarnings) { Action <Exception> logExceptionSafe = e => { ASync.OnMainThread( () => { // Log at info level so that we wouldn't trigger this handler again. Log.info( $"[{nameof(ErrorReporter)}] Exception in " + $"{nameof(Application)}.{nameof(Application.logMessageReceivedThreaded)}" + $" handler!\n\n{e}" ); }, // https://fogbugz.unity3d.com/default.asp?832198_48nbh0a3a8cjpr12 runNowIfOnMainThread: false ); }; Application.logMessageReceivedThreaded += (message, backtrace, type) => { if ( type == LogType.Assert || type == LogType.Error || type == LogType.Exception || logWarnings && type == LogType.Warning ) { try { // We want to collect backtrace on the current thread var parsedBacktrace = // backtrace may be empty in release mode. string.IsNullOrEmpty(backtrace) ? BacktraceElem.generateFromHere(1) : BacktraceElem.parseUnityBacktrace(backtrace); var data = new ErrorData(type, message, parsedBacktrace); // But call our error handler on main thread // because handlers are not guaranteed to be thread safe // and Log.info would not work in our handler ASync.OnMainThread( () => { try { onError(data); } catch (Exception e) { logExceptionSafe(e); } }, runNowIfOnMainThread: false ); } catch (Exception e) { logExceptionSafe(e); } } }; }
Application.LogCallback onLogMessageReceived( GameObjectPool <VerticalLayoutLogEntry> pool, List <string> resultsTo ) { return((message, stackTrace, type) => { foreach (var instance in current) { ASync.OnMainThread(() => { foreach (var e in createEntries( new LogEntry(message, type), pool, resultsTo, instance.view.lineWidth )) { instance.dynamicVerticalLayout.appendDataIntoLayoutData(e); } }); } }); }
public override AndroidJavaObject Invoke(string methodName, object[] args) { ASync.OnMainThread(() => invokeOnMain(methodName, args)); return(null); }
static void defer(Action a) => ASync.OnMainThread(a, runNowIfOnMainThread: false);
[UsedImplicitly] void onClick(AndroidJavaObject dialog, int which) { dialog.Call("cancel"); ASync.OnMainThread(callback); }
public static Future <A> runOnUI <A>(Fn <A> f) => Future <A> .async(promise => runOnUI(() => { var ret = f(); ASync.OnMainThread(() => promise.complete(ret)); }));
public static void invoke <A, B>(Fn <Act <A, B> > act, A a, B b) => ASync.OnMainThread(() => act()?.Invoke(a, b));
public static void invoke <A>(Fn <Act <A> > act, A a) => ASync.OnMainThread(() => act()?.Invoke(a));
public static void invoke(Fn <Action> aFn) => ASync.OnMainThread(() => aFn()?.Invoke());