【问题标题】:What things gets executed on main UI thread when we open an Android app当我们打开 Android 应用程序时,主 UI 线程上会执​​行什么操作
【发布时间】:2016-09-07 06:19:00
【问题描述】:

我有一个像这样的 TabLayout 的 android 应用:

每个选项卡加载一个片段,并且有 6 个这样的选项卡。

它也有这样的导航抽屉:

点击选项后,新的 Activity 会打开。

工具栏上也有几个按钮,点击后会打开新的 Activity。

该应用还具有像这样的上滑面板:

问题是,当我打开应用程序时,它会在几秒钟后显示给我:

当它出现时,我可以在 logcat 中看到

应用程序可能在其主线程上做了太多工作

它的解决方案是here

(此消息仅在某些设备上出现)当我们单击“确定”时,应用程序继续运行,但几秒钟后再次弹出相同的消息。我注意到另一件事,当我让应用程序打开较长时间时,不会出现此消息并且应用程序运行顺利。

我想知道当我们打开 android 应用程序时,其他活动是否也被加载以在主 UI 线程上运行?

我认为当我们打开应用程序时,ViewPager 中使用的 Fragment 会加载到主 UI 线程上。

将 Fragments 添加到 ViewPager 的代码是这样的:

tabLayout = (TabLayout) findViewById(R.id.tabLayout);
        viewPager = (ViewPager) findViewById(R.id.viewPager);
        viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());

        viewPagerAdapter.addFragments(new HomeFragment(), "Home");
        viewPagerAdapter.addFragments(new TrendingFragment(), "Best Deals");
        viewPagerAdapter.addFragments(new HomeServicesFragment(), "Home Services");
        viewPagerAdapter.addFragments(new EntertainmentFragment(), "Entertainment"); 
        viewPagerAdapter.addFragments(new FashionFragment(), "Fashion"); 
        viewPagerAdapter.addFragments(new VehicleServicesFragment(), "Vehicle Services"); 
        viewPagerAdapter.addFragments(new OthersFragment(), "Other Services"); 

        viewPager.setAdapter(viewPagerAdapter);
        tabLayout.setupWithViewPager(viewPager);

另外我想知道我是否可以使用 AsyncTask 来加载这个 TabLayout?同样,我不知道上面代码中哪一行负责 UI 更新。我不确定这样做是否有助于解决问题?

【问题讨论】:

  • 尝试设置viewPager.setOffscreenPageLimit(x),这样它就不会总是重新创建Fragments
  • 这里的问题在您的片段中。一定有什么东西阻塞了 UI 线程。您是否在这些片段中进行 api 调用?或者是否有任何使用数据库的读/写?如果有的话,你需要使用另一个线程来管理它(例如:后台线程)。
  • (1) 主应用程序类(扩展应用程序的类)中的声明,示例数据库启动 (2) 内容提供程序启动(如果有) (3) 网络操作应该在 AsyncTask/Service/Thread (4 ) 确保 Fragment 在后台操作中而不是在 onResume 中具有网络逻辑
  • @AmadYus :我将片段设为空,但问题仍然存在。是的,我的 MainActivity.java 可以读/写数据库,但我使用 firebase 进行数据库操作,所以我认为 firebase 异步管理其任务。

标签: java android multithreading android-fragments


【解决方案1】:

我收到消息的问题

应用程序可能在其主线程上做了太多工作

解决了,现在想写在这里。问题出现在drawables 图像中,我的图像尺寸较小但分辨率较高,并在ViewPager 中使用它。更改图像后,问题就消失了。

好的,上面我又问了一个问题:

我想知道其他活动是否也被加载以运行 当我们打开 android 应用程序时的主 UI 线程?

这个问题听起来可能有点连线,因为我们知道每个 Activity 都有自己的生命周期,它会根据它被创建和销毁。因此,当应用程序加载时,当然只有具有类别为 LAUNCHER 的意图过滤器的 Main Activity 才会被加载。我问这个问题是因为我在其他 Activities 的主 UI 线程上创建了许多 SharedPreferences 文件。所以我认为创建SharedPreferences 文件可能是问题的原因之一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-15
    • 2012-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-31
    • 1970-01-01
    相关资源
    最近更新 更多