📜  流依赖 android - Java (1)

📅  最后修改于: 2023-12-03 14:56:04.233000             🧑  作者: Mango

流依赖 Android - Java

简介

流依赖(Stream Dependency)是一个用于在HTTP/2协议中进行请求优先级管理的技术,也是 Android 中的一项重要技术。

HTTP/2协议引入了流依赖以实现优先级排序,以解决传统 HTTP/1.x 协议中的队首阻塞(Head-of-Line Blocking)问题,提高了网络性能。在 Android 中,流依赖被广泛应用于 RecyclerView 以及 ListView 的滑动优化中。

流依赖的基本概念

HTTP/2 协议中,每个请求都是一个流(Stream)。请求可以被分解成多个数据块,这些数据块可以并行发送到服务器,而服务器也可以异步地返回响应。每个请求存在一个唯一的标识符(Stream Identifier)。

流依赖定义了父子关系,子请求依赖于一个或多个父请求,并且可以指定该请求与其父级之间的依赖关系。流依赖以及优先级定义了请求在服务器端的处理顺序,以实现请求的优先级排序。

流依赖主要包括以下几个关键概念:

  1. 父流(Parent Stream):请求的依赖关系中的前面一个请求,即依赖于哪个请求。
  2. 依赖权重(Dependency Weight):用于指定子请求相对于父请求的优先级。
  3. 依赖类型(Exclusive or Inclusive):每个父请求只能有一个直接依赖,因为它与子请求之间存在互斥的关系。但是,如果一个父请求依赖于多个请求,这些请求之间则是共存的关系。
Android 中的应用
RecyclerView 的滑动优化

在 RecyclerView 中,我们可以通过设置滑动优化类来通过流依赖来进行优化处理。

class CustomLinearLayoutManager extends LinearLayoutManager {
    @Override 
    protected int getExtraLayoutSpace(RecyclerView.State state) {
        return getHeight();
    }

    @Override 
    protected void calculateExtraLayoutSpace(RecyclerView.State state, int[] extraLayoutSpace) {
        extraLayoutSpace[0] = getHeight();
        extraLayoutSpace[1] = getHeight();
    }

    @Override 
    public boolean supportsPredictiveItemAnimations() {
        return false;
    }
}

在这段代码中,我们通过 getExtraLayoutSpace 方法,获取了 RecyclerView 可见区域的高度,然后通过 calculateExtraLayoutSpace 方法设置了 extraLayoutSpace 的值,用来告诉 RecyclerView 在分发布局时需要增加额外的空间。

最后,通过 supportsPredictiveItemAnimations 来关闭动画预测。

这样,在 RecyclerView 中,流依赖就会根据 extraLayoutSpace 的值,实现滑动优化,提高性能。

ListView 的滑动优化

在 ListView 中,流依赖的实现与 RecyclerView 类似,我们也可以通过设置滑动优化类来实现。

class ScrollObservableListView extends ListView {
    private OnScrollStateChangedListener listener;

    public ScrollObservableListView(Context context) {
        super(context);
    }

    public ScrollObservableListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ScrollObservableListView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public void setOnScrollStateChangedListener(OnScrollStateChangedListener listener) {
        this.listener = listener;
    }

    @Override 
    public boolean fling(int velocityX, int velocityY) {
        if (listener != null) {
            listener.onScrollStateChanged(this, SCROLL_STATE_FLING);
        } 
        return super.fling(velocityX, velocityY);
    }

    @Override 
    public void onScrollStateChanged(int state) {
        if (listener != null) {
            listener.onScrollStateChanged(this, state);
        } 
        super.onScrollStateChanged(state);
    }

    public interface OnScrollStateChangedListener {
        void onScrollStateChanged(AbsListView view, int scrollState);
    }
}

在这段代码中,我们通过 setOnScrollStateChangedListener 方法,设置了滑动监听器,当 ListView 进入 fling 状态时,将回调 onScrollStateChanged 方法。

最后,我们通过实现 OnScrollStateChangedListener 接口,在 onScrollStateChanged 方法中进行流依赖的优化操作,实现滑动优化,提高性能。