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

标签 java android multithreading android-activity xamarin

我正在调查在更新我们使用的第三方库 (Xamarin.Insights) 后开始发生的性能下降。在调查过程中,我在一段较长的暂停期间停止了应用程序,这表明 Android.App.Android.OnActivityDestroyed 中隐藏了一个互斥锁。

调用堆栈显示库使用了 ActivityLifecycleCallbacks 的注册实例在我们的应用程序中跟踪 Activity 生命周期事件的接口(interface)。我正在尝试确定是否在 UI 线程上调用了这些回调。

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

  • 是否在 UI 线程上调用了 ActivityLifecycleCallbacks
  • 我可以提供一个链接来证明这一点吗?

最佳答案

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

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

OnActivityCreated on thread 1
OnCreate on thread 1
OnActivityStarted on thread 1
OnActivityResumed on thread 1

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

[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);
    }
}

关于java - 是否在 UI 线程上调用了 Android.App.Application Activity 生命周期回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30387135/

相关文章:

Java长度方法错误

java - 优化原生 Android 代码 - 编译器标志

android - 动态更改 RadioButton 的文本

java - 睡在 For 循环中

Java线程通信

multithreading - java 8中javaw进程的私有(private)字节增加

java - 如何以可测试的方式实现责任链?

java - 如何将 2 个 JList 添加到一个 JScrollPane 中?

android - 如何在广播接收器上设置振动和声音

c# - 使用 ReaderWriterLock 的真正缺点是什么