是否在UI线程上调用了Android.App.Application活动生命周期回调?

mat*_*dev 3 java multithreading android android-activity xamarin

我正在调查更新我们使用的第三方库(Xamarin.Insights)后开始出现的性能下降.在我的调查过程中,我在一次大停顿期间停止了应用程序,该停顿显示了一个隐藏在其中的互斥锁Android.App.Android.OnActivityDestroyed.

调用堆栈显示库利用ActivityLifecycleCallbacks接口的已注册实例来跟踪应用程序中的活动生命周期事件.我正在尝试确定是否在UI线程上调用这些回调.

直觉上我认为它们是在UI线程上调用的,但是我找不到确认这一点的明确证据.

  • ActivityLifecycleCallbacks在UI线程上调用的吗?
  • 我可以提供一个提供此证据的链接吗?

mat*_*dev 10

Android.App.Application.ActivityLifecycleCallbacks确实在UI线程上调用了回调方法.

实现Android.App.Application.ActivityLifecycleCallbacks接口并记录回调方法的线程ID显示线程ID与调用OnCreate活动方法的线程相同:

OnActivityCreated on thread 1
OnCreate on thread 1
OnActivityStarted on thread 1
OnActivityResumed on thread 1
Run Code Online (Sandbox Code Playgroud)

下面的示例验证了这一点:

[Activity (Label = "UIThreadsCallbacks", MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : Activity
{
    protected override void OnCreate (Bundle bundle)
    {
        base.OnCreate (bundle);

        // Set our view from the "main" layout resource
        SetContentView (Resource.Layout.Main);

        Console.WriteLine ("OnCreate on thread " + System.Threading.Thread.CurrentThread.ManagedThreadId);
    }
}

[Application]
public class MyApplication : Application
{
    public MyApplication(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer) { 
    }

    public override void OnCreate ()
    {
        RegisterActivityLifecycleCallbacks(new LifecycleCallbacks());
        base.OnCreate ();
    }
}

public class LifecycleCallbacks : Java.Lang.Object, Android.App.Application.IActivityLifecycleCallbacks
{
    public void OnActivityCreated (Activity activity, Bundle savedInstanceState)
    {
        Console.WriteLine ("OnActivityCreated on thread " + System.Threading.Thread.CurrentThread.ManagedThreadId);
    }

    public void OnActivityDestroyed (Activity activity)
    {
        Console.WriteLine ("OnActivityDestroyed on thread " + System.Threading.Thread.CurrentThread.ManagedThreadId);
    }

    public void OnActivityPaused (Activity activity)
    {
        Console.WriteLine ("OnActivityPaused on thread " + System.Threading.Thread.CurrentThread.ManagedThreadId);
    }

    public void OnActivityResumed (Activity activity)
    {
        Console.WriteLine ("OnActivityResumed on thread " + System.Threading.Thread.CurrentThread.ManagedThreadId);
    }

    public void OnActivitySaveInstanceState (Activity activity, Bundle outState)
    {
        Console.WriteLine ("OnActivitySaveInstanceState on thread " + System.Threading.Thread.CurrentThread.ManagedThreadId);
    }

    public void OnActivityStarted (Activity activity)
    {
        Console.WriteLine ("OnActivityStarted on thread " + System.Threading.Thread.CurrentThread.ManagedThreadId);
    }

    public void OnActivityStopped (Activity activity)
    {
        Console.WriteLine ("OnActivityStopped on thread " + System.Threading.Thread.CurrentThread.ManagedThreadId);
    }
}
Run Code Online (Sandbox Code Playgroud)


Art*_*lin 5

您可以轻松检查哪个线程调用了该方法:

  1. 通过日志记录Thread.currentThread().getName(),如果是主线程,您会看到类似的内容Main Thread
  2. 通过检查当前线程的Looper Looper.getMainLooper() == Looper.getMyLooper(),如果是true主线程的话。
  3. 通过在方法中放置断点并检查 IDE/调试器中堆栈跟踪中的线程名称。