包含viewpager的android活动缓慢打开
Posted
技术标签:
【中文标题】包含viewpager的android活动缓慢打开【英文标题】:android activity containing viewpager opening slowly 【发布时间】:2018-11-14 07:38:30 【问题描述】:我正在尝试从一项活动导航到另一项活动。第二个活动有一个具有三个片段的浏览器。其中两个片段有很多视图,其中一个片段视图较少。我尝试在 viewpager 中只保留一个具有很多视图的片段。加载需要一些时间。我尝试了另一个有很多观点的。加载也需要时间。但是当我保留视图较少的片段时,花费的时间更少。如果我一次全部加载,则再次加载需要大量时间。我首先在两个片段上都有很多视图层次结构,但我最终使用表格布局将它们全部删除。活动呈现缓慢。 片段 1:
<ScrollView
android:id="@+id/scroll"
android:layout_
android:layout_>
<LinearLayout
android:layout_
android:layout_
android:orientation="vertical">
<TableLayout
android:layout_
android:layout_>
<TableRow style="@style/TableRowStyle">
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1" />
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1" />
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1" />
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1" />
</TableRow>
<TableRow style="@style/TableRowStyle">
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1"/>
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1"/>
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1"/>
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1"/>
</TableRow>
<TableRow
android:layout_
android:layout_
android:background="@color/white">
<View
android:layout_
android:layout_
android:background="@color/white" />
</TableRow>
<TableRow style="@style/TableRowStyle">
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1.5"/>
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1"/>
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1" />
</TableRow>
<TableRow style="@style/TableRowStyle">
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1.5" />
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1"/>
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1"/>
</TableRow>
<TableRow
android:layout_
android:layout_
android:background="@color/white">
<View
android:layout_
android:layout_
android:background="@color/white" />
</TableRow>
<TableRow
android:id="@+id/ll_nfo1"
style="@style/TableRowStyle"
android:visibility="visible">
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1" />
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1" />
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1"/>
</TableRow>
<TableRow android:id="@+id/ll_nfo2"
style="@style/TableRowStyle"
android:visibility="visible">
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1"/>
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1"/>
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1"/>
</TableRow>
<TableRow style="@style/BidOfferTableRowStyle">
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1"/>
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1"/>
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1"/>
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1"/>
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1" />
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1" />
</TableRow>
<TableRow style="@style/BidOfferTableRowStyle">
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1" />
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1"/>
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1"/>
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1" />
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1" />
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1"/>
</TableRow>
<TableRow style="@style/BidOfferTableRowStyle">
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1" />
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1" />
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1"/>
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1"/>
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1" />
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1"/>
</TableRow>
<TableRow style="@style/BidOfferTableRowStyle">
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1" />
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1" />
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1"/>
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1"/>
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1"/>
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1"/>
</TableRow>
<TableRow style="@style/BidOfferTableRowStyle">
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1"/>
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1"/>
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1"/>
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1" />
</TableRow>
</TableLayout>
</LinearLayout>
</ScrollView>
<LinearLayout
android:id="@+id/ll_bottom"
android:layout_
android:layout_>
<com.intmilli.imobile.Views.CustomTextView
android:id="@+id/tv_h_first"
android:layout_
android:layout_
android:layout_weight="1"/>
<View
android:id="@+id/view_line3_left"
android:layout_
android:layout_toRightOf="@id/tv_h_first"
android:background="@color/mainbg_lightblue" />
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1" />
</LinearLayout>
</RelativeLayout>
片段 3:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
android:fillViewport="true">
<TableLayout
android:layout_
android:layout_>
<TableRow
android:layout_
android:layout_>
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1"
/>
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1" />
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1" />
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1" />
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1"/>
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1"/>
</TableRow>
<TableRow
android:layout_
android:layout_
android:paddingTop="4dp"
android:paddingBottom="4dp">
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1" />
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1"/>
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1" />
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1" />
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1" />
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1" />
</TableRow>
<TableRow
android:layout_
android:layout_>
<Spinner
android:id="@+id/day_spinner"
android:layout_
android:layout_ />
<Spinner
android:id="@+id/limit_spinner"
android:layout_
android:layout_ />
<Spinner
android:id="@+id/buy_spinner"
android:layout_
android:layout_ />
</TableRow>
<TableRow
android:layout_
android:layout_
android:layout_margin="8dp">
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1"/>
<ImageButton
android:id="@+id/sub_qty"
android:layout_
android:layout_
android:layout_weight="0.3" />
<EditText
android:id="@+id/et_qty"
android:layout_
android:layout_/>
<ImageButton
android:id="@+id/add_qty"
android:layout_
android:layout_
android:layout_weight="0.3"/>
</TableRow>
<TableRow
android:layout_
android:layout_
android:layout_margin="8dp">
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1" />
<ImageButton
android:id="@+id/sub_price"
android:layout_
android:layout_
android:layout_weight="0.3" />
<EditText
android:id="@+id/et_pricevalue"
android:layout_
android:layout_ />
<ImageButton
android:id="@+id/add_price"
android:layout_
android:layout_
android:layout_weight="0.3" />
</TableRow>
<TableRow
android:layout_
android:layout_
android:layout_margin="8dp">
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1"/>
<ImageButton
android:id="@+id/sub_dis_qty"
android:layout_
android:layout_
android:layout_weight="0.3"/>
<EditText
android:id="@+id/et_dis_qty"
android:layout_
android:layout_ />
<ImageButton
android:id="@+id/add_dis_qty"
android:layout_
android:layout_
android:layout_weight="0.3"/>
</TableRow>
<TableRow
android:layout_
android:layout_
android:layout_margin="8dp">
<com.intmilli.imobile.Views.CustomTextView
android:layout_
android:layout_
android:layout_weight="1"/>
<ImageButton
android:id="@+id/sub_tri_price"
android:layout_
android:layout_
android:layout_weight="0.3"/>
<EditText
android:id="@+id/et_triggerPrice"
android:layout_
android:layout_ />
<ImageButton
android:id="@+id/add_tri_price"
android:layout_
android:layout_
android:layout_weight="0.3" />
</TableRow>
<TableRow
android:layout_
android:layout_
android:gravity="center"
android:layout_marginTop="8dp"
android:layout_marginBottom="6dp">
<CheckBox
android:id="@+id/ch_stopLoss"
android:layout_
android:layout_ />
<CheckBox
android:id="@+id/ch_IOC"
android:layout_
android:layout_ />
</TableRow>
<TableRow
android:layout_
android:layout_
android:gravity="center">
<com.intmilli.imobile.Views.CustomTextView
android:id="@+id/tv_placeOrderBtn"
android:layout_
android:layout_ />
</TableRow>
</TableLayout>
</ScrollView>
正如我所说的片段 1 和 3 需要很多时间。谁能帮忙解决这个问题谢谢!
【问题讨论】:
您在两个滚动视图中都有相当大的内容。尝试为此使用 RecyclerView @VladyslavMatviienko 实际上由于 *** 限制只有 30000 个字符,我没有给出整个布局。所以我不得不卸下一些零件。数据是这样的,我不能使用回收站视图,只能使用布局。 你能在打开片段 1 和 3 时提及 logcats 吗? @AbhinavGupta 导航时没有此类相关日志数据 【参考方案1】:权重 不好 不适合大量使用。我看到您在布局中使用了太多 android:layout_weight
。这会导致加载布局缓慢。因为它需要根据设备屏幕调整视图。
所以不要使用太多的权重并使用RelativeLayout 或ConstraintLayout.
不要在onCreate()
或onCreateView()
中编写任何逻辑、数据获取、视图管理。
在片段的onViewCreated()
中执行所有findViewById()
。另请阅读Fragment Lifecycle 以获得更好的理解。
如果您正在调用 API,则在onViewCreated()
中调用一些延迟。它会先创建视图,然后设置从 API 接收的数据。
请注意,您在 UI 或主线程中没有进行任何长时间操作或逻辑。这应该在Worker Thread 中完成,例如AsyncTask 或新线程。
【讨论】:
这不起作用 ConstraintLayout 花费了两倍的时间。我删除了表格布局,只使用了 ConstraintLayout。打开另一个活动花费了两倍的时间 您目前是否也在视图中填充一些数据? 它来自服务器,但我使用的是套接字,所以没有响应问题,我现在已经更改了两次 ui,约束布局占用的时间最长 您是否尝试过禁用服务器实现一次。你会知道它是 UI 问题还是数据填充问题。 禁用了所有服务,这仍然需要时间,两个片段的 oncreateview 方法都需要很长时间,平均两个都需要 140 毫秒,有时片段 1 也需要 200 毫秒,我从 android profiler 获得了这些值。活动平均需要 2/2.5 秒才能打开以上是关于包含viewpager的android活动缓慢打开的主要内容,如果未能解决你的问题,请参考以下文章
android - 将数据从 Activity 传递到 ViewPager 中的 Fragment
Android ViewPager,ListFragments以及更新列表中的元素时更新
Android ViewPager + 带有动态 ListViews 的片段
ViewPager - 将数据从片段发送到活动时出现 Android 错误 setCurrentItem(int,boolean)