慢速创建碎片 Android

huangapple go评论104阅读模式
英文:

slow creation of fragment android

问题

  1. 所以我有一个片段它的启动速度非常慢就像跳过了150多帧
  2. 我试图在片段内部设置ViewPager并添加一个onPageChangeListener在向某个方向滑动后禁用滑动
  3. 问题在于这真的降低了片段的加载速度我尝试将其移动到单独的线程和AsyncTask但仍然很慢
  4. 片段
  5. ```java
  6. public class SettingsFragment extends Fragment {
  7. public View mView;
  8. public SettingsFragment() {
  9. }
  10. @Override
  11. public void onCreate(Bundle savedInstanceState) {
  12. super.onCreate(savedInstanceState);
  13. }
  14. @Deprecated
  15. @Override
  16. public View onCreateView(LayoutInflater inflater, final ViewGroup container,
  17. Bundle savedInstanceState) {
  18. // 填充此片段的布局
  19. final View rootview = inflater.inflate(R.layout.fragment_settings, container, false);
  20. this.mView = rootview;
  21. Task task = new Task();
  22. task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
  23. return rootview;
  24. }
  25. @Deprecated
  26. public class Task extends AsyncTask<Void, Void, Void> {
  27. @Override
  28. protected Void doInBackground(Void... voids) {
  29. final CustomViewPager viewPager = mView.findViewById(R.id.ViewPager);
  30. viewPager.setAdapter(new Adapter(getFragmentManager()));
  31. viewPager.setCurrentItem(1);
  32. viewPager.setOffscreenPageLimit(1);
  33. viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
  34. @Override
  35. public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
  36. }
  37. @Override
  38. public void onPageSelected(int position) {
  39. if (position == 0) {
  40. viewPager.setPagingEnabled(false);
  41. }
  42. }
  43. @Override
  44. public void onPageScrollStateChanged(int state) {
  45. }
  46. });
  47. return null;
  48. }
  49. }
  50. }

片段的xml布局文件:

  1. <!-- 在这里是你的 XML 布局内容 -->

适配器(Adapter.java):

  1. public class Adapter extends FragmentStatePagerAdapter {
  2. public Adapter(FragmentManager fragmentManager) {
  3. super(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
  4. }
  5. @NonNull
  6. @NotNull
  7. @Override
  8. public Fragment getItem(int position) {
  9. if (position == 0) {
  10. return new BlankFragment();
  11. }
  12. if (position == 1) {
  13. return new SettingsFragment();
  14. }
  15. return null;
  16. }
  17. @Override
  18. public int getCount() {
  19. return 2;
  20. }
  21. }

这些是关于你的代码的翻译。如果你有其他问题,请随时提问。

英文:

So I have a fragment which launches really slowly like it skips 150+ frames.
I am trying to setup ViewPager inside of the fragment and add onPageChangeListener which disables swipe after swiping to a certain direction.

The problem is that it really slows down the fragment loading speed. I tried moving it to a separate thread and AsyncTask but its still slow.

Fragment:

  1. public class SettingsFragment extends Fragment {
  2. public View mView;
  3. public SettingsFragment() {
  4. }
  5. @Override
  6. public void onCreate(Bundle savedInstanceState) {
  7. super.onCreate(savedInstanceState);
  8. }
  9. @Deprecated
  10. @Override
  11. public View onCreateView(LayoutInflater inflater, final ViewGroup container,
  12. Bundle savedInstanceState) {
  13. // Inflate the layout for this fragment
  14. final View rootview = inflater.inflate(R.layout.fragment_settings,container,false);
  15. this.mView=rootview;
  16. Task task=new Task();
  17. task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
  18. return rootview;
  19. }
  20. @Deprecated
  21. public class Task extends AsyncTask&lt;Void,Void,Void&gt;{
  22. @Override
  23. protected Void doInBackground(Void... voids) {
  24. final CustomViewPager viewPager = mView.findViewById(R.id.ViewPager);
  25. viewPager.setAdapter(new Adapter(getFragmentManager()));
  26. viewPager.setCurrentItem(1);
  27. viewPager.setOffscreenPageLimit(1);
  28. viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
  29. @Override
  30. public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
  31. }
  32. @Override
  33. public void onPageSelected(int position) {
  34. if (position == 0) {
  35. viewPager.setPagingEnabled(false);
  36. }
  37. }
  38. @Override
  39. public void onPageScrollStateChanged(int state) {
  40. }
  41. });
  42. return null;
  43. }
  44. }
  45. }

The xml layout file for fragment:

  1. &lt;androidx.constraintlayout.widget.ConstraintLayout xmlns:app=&quot;http://schemas.android.com/apk/res-auto&quot;
  2. xmlns:tools=&quot;http://schemas.android.com/tools&quot;
  3. xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
  4. android:layout_height=&quot;match_parent&quot;
  5. android:layout_width=&quot;match_parent&quot;
  6. android:background=&quot;#fff&quot; android:animationCache=&quot;true&quot;
  7. android:id=&quot;@+id/SettingsFragmentContainer&quot;
  8. android:drawingCacheQuality=&quot;high&quot;&gt;
  9. &lt;androidx.appcompat.widget.Toolbar
  10. android:layout_width=&quot;0dp&quot;
  11. android:layout_height=&quot;wrap_content&quot;
  12. android:background=&quot;?attr/colorPrimary&quot;
  13. android:theme=&quot;?attr/actionBarTheme&quot;
  14. android:minHeight=&quot;?attr/actionBarSize&quot; app:layout_constraintTop_toTopOf=&quot;parent&quot;
  15. app:layout_constraintStart_toStartOf=&quot;parent&quot;
  16. android:id=&quot;@+id/SettingsActivityToolbar&quot; app:layout_constraintEnd_toEndOf=&quot;parent&quot;/&gt;
  17. &lt;TextView
  18. android:text=&quot;Settings&quot;
  19. android:layout_width=&quot;65dp&quot;
  20. android:layout_height=&quot;23dp&quot; app:layout_constraintTop_toTopOf=&quot;parent&quot;
  21. app:layout_constraintStart_toStartOf=&quot;parent&quot; android:layout_marginTop=&quot;18dp&quot;
  22. app:layout_constraintEnd_toEndOf=&quot;parent&quot; android:id=&quot;@+id/Settings_textview&quot;
  23. android:textAppearance=&quot;@style/ActionBar.nameText&quot;/&gt;
  24. &lt;ImageButton
  25. android:layout_width=&quot;46dp&quot;
  26. android:layout_height=&quot;34dp&quot; app:srcCompat=&quot;@drawable/settings_icon_back&quot;
  27. android:id=&quot;@+id/backPressButton&quot;
  28. android:rotation=&quot;180&quot; android:backgroundTint=&quot;#fff&quot;
  29. android:background=&quot;@null&quot;
  30. app:layout_constraintStart_toStartOf=&quot;@+id/SettingsActivityToolbar&quot;
  31. android:layout_marginStart=&quot;2dp&quot; app:layout_constraintTop_toTopOf=&quot;parent&quot;
  32. android:layout_marginTop=&quot;16dp&quot; android:onClick=&quot;click&quot; android:drawingCacheQuality=&quot;high&quot;/&gt;
  33. &lt;TextView
  34. android:text=&quot;&quot;
  35. android:layout_width=&quot;0dp&quot;
  36. android:layout_height=&quot;0.1dp&quot; app:layout_constraintStart_toStartOf=&quot;parent&quot;
  37. app:layout_constraintEnd_toEndOf=&quot;parent&quot; android:id=&quot;@+id/linebreak1&quot; android:layout_marginTop=&quot;10dp&quot;
  38. app:layout_constraintTop_toBottomOf=&quot;@+id/backPressButton&quot; android:background=&quot;#A1A8AC&quot;/&gt;
  39. &lt;Switch
  40. android:text=&quot;Test Test&quot;
  41. android:layout_width=&quot;0dp&quot;
  42. android:layout_height=&quot;47dp&quot; android:id=&quot;@+id/switch4&quot;
  43. android:textAppearance=&quot;@style/ActionBar.nameText&quot; app:layout_constraintStart_toStartOf=&quot;parent&quot;
  44. android:layout_marginStart=&quot;25dp&quot; android:layout_marginEnd=&quot;25dp&quot;
  45. app:layout_constraintEnd_toEndOf=&quot;parent&quot; android:thumbTint=&quot;@drawable/switch_thumb_selector&quot;
  46. android:trackTint=&quot;@drawable/switch_track_selector&quot; android:layout_marginTop=&quot;18dp&quot;
  47. app:layout_constraintTop_toBottomOf=&quot;@+id/backPressButton&quot; tools:ignore=&quot;UseSwitchCompatOrMaterialXml&quot;/&gt;
  48. &lt;TextView
  49. android:layout_width=&quot;0dp&quot;
  50. android:layout_height=&quot;0.1dp&quot; android:id=&quot;@+id/linebreak2&quot;
  51. app:layout_constraintStart_toStartOf=&quot;parent&quot;
  52. android:layout_marginStart=&quot;25dp&quot; android:layout_marginEnd=&quot;25dp&quot;
  53. app:layout_constraintEnd_toEndOf=&quot;parent&quot; android:background=&quot;#A1A8AC&quot;
  54. android:layout_marginTop=&quot;10dp&quot; app:layout_constraintTop_toBottomOf=&quot;@+id/switch4&quot;/&gt;
  55. &lt;TextView
  56. android:layout_width=&quot;0dp&quot;
  57. android:layout_height=&quot;67dp&quot; android:id=&quot;@+id/update&quot;
  58. app:layout_constraintStart_toStartOf=&quot;parent&quot;
  59. app:layout_constraintEnd_toEndOf=&quot;parent&quot;
  60. android:clickable=&quot;true&quot;
  61. android:textAppearance=&quot;@style/ActionBar.nameText&quot; app:layout_constraintHorizontal_bias=&quot;0.0&quot;
  62. android:background=&quot;?attr/selectableItemBackground&quot; android:layout_marginTop=&quot;16dp&quot;
  63. app:layout_constraintTop_toBottomOf=&quot;@+id/switch4&quot; android:onClick=&quot;onClickUpdate&quot;/&gt;
  64. &lt;TextView
  65. android:text=&quot;Current Version 1.0.1&quot;
  66. android:layout_width=&quot;wrap_content&quot;
  67. android:clickable=&quot;true&quot;
  68. android:layout_height=&quot;0dp&quot; android:id=&quot;@+id/enter_version&quot;
  69. app:layout_constraintTop_toTopOf=&quot;@+id/update&quot;
  70. android:layout_marginTop=&quot;36dp&quot; android:layout_marginEnd=&quot;206dp&quot;
  71. app:layout_constraintEnd_toEndOf=&quot;@+id/update&quot;/&gt;
  72. &lt;TextView
  73. android:text=&quot;Check Update&quot;
  74. android:layout_width=&quot;wrap_content&quot;
  75. android:layout_height=&quot;wrap_content&quot;
  76. android:clickable=&quot;true&quot;
  77. android:id=&quot;@+id/update_textview&quot;
  78. android:textAppearance=&quot;@style/ActionBar.nameText&quot; android:layout_marginEnd=&quot;228dp&quot;
  79. app:layout_constraintEnd_toEndOf=&quot;@+id/update&quot; app:layout_constraintTop_toTopOf=&quot;@+id/update&quot;
  80. android:layout_marginTop=&quot;10dp&quot;/&gt;
  81. &lt;com.testapp.test2.CustomViewPager
  82. android:layout_width=&quot;0dp&quot;
  83. android:layout_height=&quot;0dp&quot;
  84. app:layout_constraintStart_toStartOf=&quot;parent&quot; app:layout_constraintEnd_toEndOf=&quot;parent&quot;
  85. android:id=&quot;@+id/ViewPager&quot; app:layout_constraintTop_toTopOf=&quot;parent&quot;
  86. app:layout_constraintBottom_toBottomOf=&quot;parent&quot;/&gt;
  87. &lt;/androidx.constraintlayout.widget.ConstraintLayout&gt;

Adapter.java

  1. public class Adapter extends FragmentStatePagerAdapter {
  2. public Adapter(FragmentManager fragmentManager){
  3. super(fragmentManager,BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
  4. }
  5. @NonNull
  6. @NotNull
  7. @Override
  8. public Fragment getItem(int position) {
  9. if(position==0){
  10. return new BlankFragment();
  11. }
  12. if(position==1){
  13. return new SettingsFragment();
  14. }
  15. return null;
  16. }
  17. @Override
  18. public int getCount() {
  19. return 2;
  20. }
  21. }

Logcat:

  1. 2020-10-15 07:51:34.234 14029-14034/com.testapp.test2 I/zygote64: Increasing code cache capacity to 1024KB
  2. 2020-10-15 07:51:35.302 14029-14029/com.testapp.test2 I/Choreographer: Skipped 165 frames! The application may be doing too much work on its main thread.
  3. 2020-10-15 07:51:50.250 14029-14034/com.testapp.test2 I/zygote64: Do full code cache collection, code=502KB, data=324KB
  4. 2020-10-15 07:51:50.252 14029-14034/com.testapp.test2 I/zygote64: After code cache collection, code=501KB, data=287KB
  5. 2020-10-15 07:51:51.006 14029-14034/com.testapp.test2 I/zygote64: Do partial code cache collection, code=503KB, data=297KB
  6. 2020-10-15 07:51:51.007 14029-14034/com.testapp.test2 I/zygote64: After code cache collection, code=503KB, data=297KB
  7. 2020-10-15 07:51:51.007 14029-14034/com.testapp.test2 I/zygote64: Increasing code cache capacity to 2MB
  8. 2020-10-15 07:51:51.886 14029-14034/com.testapp.test2 I/zygote64: Compiler allocated 8MB to compile void android.view.ViewRootImpl.performTraversals()
  9. 2020-10-15 07:51:54.868 14029-14029/com.testapp.test2 I/TouchMotionHandler: handler onDetached

How do I fix this?

EDIT:

  1. java.lang.NullPointerException: Attempt to invoke virtual method &#39;void androidx.fragment.app.Fragment.setMenuVisibility(boolean)&#39; on a null object reference
  2. at androidx.fragment.app.FragmentStatePagerAdapter.instantiateItem(FragmentStatePagerAdapter.java:189)
  3. at androidx.viewpager.widget.ViewPager.addNewItem(ViewPager.java:1010)
  4. at androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1158)
  5. at androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1092)
  6. at androidx.viewpager.widget.ViewPager.onMeasure(ViewPager.java:1622)
  7. at android.view.View.measure(View.java:22251)
  8. at androidx.constraintlayout.widget.ConstraintLayout$Measurer.measure(ConstraintLayout.java:763)
  9. at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.measure(BasicMeasure.java:426)
  10. at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.solverMeasure(BasicMeasure.java:335)
  11. at androidx.constraintlayout.solver.widgets.ConstraintWidgetContainer.measure(ConstraintWidgetContainer.java:117)
  12. at androidx.constraintlayout.widget.ConstraintLayout.resolveSystem(ConstraintLayout.java:1532)
  13. at androidx.constraintlayout.widget.ConstraintLayout.onMeasure(ConstraintLayout.java:1607)
  14. at android.view.View.measure(View.java:22251)
  15. at androidx.constraintlayout.widget.ConstraintLayout$Measurer.measure(ConstraintLayout.java:763)
  16. at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.measure(BasicMeasure.java:426)
  17. at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.measureChildren(BasicMeasure.java:105)
  18. at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.solverMeasure(BasicMeasure.java:247)
  19. at androidx.constraintlayout.solver.widgets.ConstraintWidgetContainer.measure(ConstraintWidgetContainer.java:117)
  20. at androidx.constraintlayout.widget.ConstraintLayout.resolveSystem(ConstraintLayout.java:1532)
  21. at androidx.constraintlayout.widget.ConstraintLayout.onMeasure(ConstraintLayout.java:1607)
  22. at android.view.View.measure(View.java:22251)
  23. at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6767)
  24. at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
  25. at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:146)
  26. at android.view.View.measure(View.java:22251)
  27. at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6767)
  28. at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1514)
  29. at android.widget.LinearLayout.measureVertical(LinearLayout.java:806)
  30. at android.widget.LinearLayout.onMeasure(LinearLayout.java:685)
  31. at android.view.View.measure(View.java:22251)
  32. at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6767)
  33. at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
  34. at android.view.View.measure(View.java:22251)
  35. at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6767)
  36. at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1514)
  37. at android.widget.LinearLayout.measureVertical(LinearLayout.java:806)
  38. at android.widget.LinearLayout.onMeasure(LinearLayout.java:685)
  39. at android.view.View.measure(View.java:22251)
  40. at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6767)
  41. at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
  42. at com.android.internal.policy.DecorView.onMeasure(DecorView.java:898)
  43. at android.view.View.measure(View.java:22251)
  44. at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2500)
  45. at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1564)
  46. at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1826)
  47. at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1446)
  48. at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6954)
  49. at android.view.Choreographer$CallbackRecord.run(Choreographer.java:925)
  50. at android.view.Choreographer.doCallbacks(Choreographer.java:737)
  51. at android.view.Choreographer.doFrame(Choreographer.java:669)
  52. 2020-10-16 00:56:36.824 14663-14663/com.testapp.test2 E/AndroidRuntime: at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:911)
  53. at android.os.Handler.handleCallback(Handler.java:790)
  54. at android.os.Handler.dispatchMessage(Handler.java:99)
  55. at android.os.Looper.loop(Looper.java:192)
  56. at android.app.ActivityThread.main(ActivityThread.java:6702)
  57. at java.lang.reflect.Method.invoke(Native Method)
  58. at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:549)
  59. at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:826)

答案1

得分: 0

我通过将构建类型从调试更改为发布来修复了它。

英文:

I fixed it by changing the build type from debug to release.

huangapple
  • 本文由 发表于 2020年10月15日 23:06:36
  • 转载请务必保留本文链接:https://go.coder-hub.com/64374555.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定