【发布时间】: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