实际上这套数据加载逻辑已经运行了快一年多了,之前也没有这些问题的。笔者是后面接手的,也没觉得有问题。也许是最初数据量小当时看不出来
运行到今天设计业务数据量是3650条,实际业务数据条数是1100条左右;这个业务数据量原本也不是特别大。所以也没觉得有问题。
直到其他业务组的数据接入后数据量起来了这个列表数据就卡顿的几乎不能用了,而不凑巧被领导知道了,于是就有了本次优化
<android.support.v4.widget.NestedScrollView
android:id="@+id/nestedScrollView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<live.bingoogolapple.refreshlayout.BGARefreshLayout
android:id="@+id/mRefreshLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycleView_playback"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#FFFFFFFF"
android:nestedScrollingEnabled="false"
android:paddingLeft="20dp"
android:paddingRight="10dp"
android:paddingBottom="8dp"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
live.bingoogolapple.refreshlayout.BGARefreshLayout>
android.support.v4.widget.NestedScrollView>
RecyclerView.Adapter 是用于在 RecyclerView 中展示数据的关键组件之一。下面是使用 RecyclerView.Adapter 的基本步骤:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
// 适配器的代码
}
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
public static class MyViewHolder extends RecyclerView.ViewHolder {
// ViewHolder 的代码
}
}
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// 创建 ViewHolder
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
// 绑定数据到 ViewHolder
}
@Override
public int getItemCount() {
// 获取数据集合的大小
}
}
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// 创建 ViewHolder
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);
return new MyViewHolder(itemView);
}
}
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
// 绑定数据到 ViewHolder
MyData data = dataList.get(position);
holder.bindData(data);
}
}
RecyclerView recyclerView = findViewById(R.id.recycler_view);
MyAdapter adapter = new MyAdapter(dataList);
recyclerView.setAdapter(adapter);
在上面的代码中,dataList
是数据集合,R.layout.item_layout
是每个子项的布局文件。通过以上步骤,就可以使用 RecyclerView.Adapter 在 RecyclerView 中展示数据了。
Glide.with(context)
.load(imgUrl)
.into(holder.imageview);
BGARefreshViewHolder bgaNormalRefreshViewHolder = new BGANormalRefreshViewHolder(this, true);
mRefreshLayout.setRefreshViewHolder(bgaNormalRefreshViewHolder);
nestedScrollView = findViewById(R.id.nestedScrollView);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
nestedScrollView.setOnScrollChangeListener(new View.OnScrollChangeListener() {
@Override
public void onScrollChange(View view, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
NestedScrollView toNesstedScrollView = (NestedScrollView) view;
if (scrollY < 5
|| toNesstedScrollView.getChildAt(0).getMeasuredHeight()
== view.getMeasuredHeight()) {
return;
}
int height = toNesstedScrollView.getChildAt(0).getMeasuredHeight()
- view.getMeasuredHeight();
if (scrollY == height) {
// 为BGARefreshLayout 设置代理
if(mRefreshLayout.getDelegate()==null){
mRefreshLayout.setDelegate(XXXXActivity.this);
}
mRefreshLayout.beginLoadingMore();
}
}
});
}
Android 屏幕渲染 16ms 柱形图是指在 Android 应用程序中,屏幕渲染所花费的时间以柱形图的形式进行可视化展示。这个柱形图通常用于监测应用程序的性能,特别是在绘制 UI 时所花费的时间。
在 Android 中,每秒钟需要渲染 60 帧的屏幕,即每帧的时间限制为 16 毫秒(1 秒 = 1000 毫秒 / 60 帧 ≈ 16.67 毫秒)。如果屏幕渲染超过 16 毫秒,就会导致丢帧(屏幕卡顿)。
柱形图中的每个柱子代表一帧的渲染时间。如果柱子的高度超过 16 毫秒,就表示该帧的渲染时间超过了理想的 16 毫秒限制。柱形图越高,表示渲染时间越长,应用程序的性能可能会受到影响。
通过观察柱形图,开发者可以判断应用程序在绘制 UI 时是否存在性能问题,并进行相应的优化。优化的目标是尽量保持每帧的渲染时间在 16 毫秒以内,以确保流畅的用户体验。
看下面这张渲染耗时图柱,都破了屏幕了,底部那条红线就没放眼里蛤!
一般都在开发者选项-GPU呈现模式分析:
京东首页交互流畅度如下:
=================================请看下一章