Eli 5:Square 的流量库是做什么的?

Eli 5:Square 的流量库是做什么的?

原文:https://medium.com/hackernoon/eli5-what-does-squares-flow-library-do-ecd497b61dc3

(或者我的叉吧,无流)是背刺。嗯,技术上来说是持有逆推的东西,叫做历史

History是——你可以猜到——应用程序在给定时间的历史。这个History实际上只是一个对象列表——尽管它的索引是反向的,其中get(0)返回最后插入的元素,而get(size-1)返回第一个插入的元素。一堆,如果你愿意的话。

A  ← top **element**, .get(0)
-
B
-
C
-
D

作为列表:

[D,C,B,A]

在这个列表中,对象DCBA只是一个类的简单实例,带有一些数据字段和 hashCode/equals 方法;也称为“值对象”。这只是一个看起来像这样的类

**public class** A {
    **private final** String **data**;

    **public** A(String data) {
        **this**.**data** = data;
    }

    @Override
    **public boolean** equals(Object object) { *// auto-generated* **if**(object == **null**) {
            **return false**;
        }
        **if**(!(object **instanceof** A)) {
            **return false**;
        }
        **return** StringUtils.equals(**this**, **data**, ((A) object).**data**);
    }

    @Override
    **public int** hashCode() { *// auto-generated* **return** getClass().hashCode() + 31 * (**null** == **data** ? 0 : **data**.hashCode());
    }
}

所以,这个A完全简单的对象被称为Key,它只包含一个字符串并覆盖 equals/hashCode。这代表了您在应用程序中的位置。

在活动的情况下,这意味着您有以下活动:

DActivity, CActivity, BActivity, AActivity

onStopDActivityCActivityBActivity会在背景中(但不会被破坏),而AActivity在前面(调用onStart()onResume())。

当你在BActivity中启动AActivity时,发生的事情是BActivity被放到onPause()中,AActivity启动并被放到……实际上,让我来抓取文档

执行活动 A 的 onPause()方法。

活动 B 的 onCreate()、onStart()和 onResume()方法按顺序执行。(活动 B 现在有了用户焦点。)

然后,如果 Activity A 在屏幕上不再可见,它的 onStop()方法就会执行。

但在这种情况下,我不得不:

1.)查看文档,了解发生了什么

2.)backstack 是隐式的,所以立即从AActivityCActivity是非常非常困难的。你需要修补CLEAR_TOP意图标志,并希望它实际工作。如果没有,你甚至可以在你的活动上设置singleTop launchMode,以某种方式最终让它工作。

— — — — -

就心流而言,这并不复杂。当你打电话时

Flow.get(this).set(A.create());

那么你收到的就叫做“遍历”,是“分派”的。简而言之,它告诉你发生了一些事情,并显示你之前在应用程序中的位置:[D,C,B],以及你正在前往的位置:[D,C,B,A]

如果你在[D,C,B,A]中调用Flow.get(this).set(C.create());,那么你将得到一个遍历,表明你在[D,C,B,A]中,你将到达[D,C]

发生了什么(我从文档中抓取的东西)完全由你来写,所以你可以直接控制发生了什么。

这通常意味着您最终会:

-检查您是否仍处于完全相同的状态,如果是,则不做任何事情(告诉流您已经处理了遍历) -保持当前布局的状态 -移除当前布局 -膨胀新布局 -恢复新布局的状态(如果状态存在) -添加新布局 -告诉流您已经处理了遍历

(这里有一个简单调度器的例子)

— — — — — —

这实际上很棒,原因有很多:

1.)在onPause()中,后台的视图不会被破坏,所以您不必确保在返回时“重新加载数据并刷新”

2.)视图被销毁,从而释放了内存,这更具性能

3.)活动转换有额外的开销,这使得它们比视图转换慢(同样,TransitionEverywhere对视图有效,但对活动/片段无效)

4.)现在,您可以直接访问“您在应用程序中的位置”,还可以访问“当我从这里到那里时会发生什么”,这样设置遍历实际上非常容易:

[D,C,B,A] = > [C,E,B]

因为这实际上只是

Flow.get(**this**).setHistory(
        History.newBuilder()
            .push(C.create())
            .push(E.create())
            .push(B.create())
        .build()
);

您打算如何使用活动堆栈和意图标志来实现这一点?没有该死的线索!

— — — — — — — — — — — — — — — — — — — — — — —

— — — — — — — — — — — — — — — — — — — — — — —

TL;DR: Flow 是一个 backstack 库,允许您轻松地保持/恢复视图的状态,并允许您处理在给定时刻的位置和前进方向之间的变化。这差不多就是它所做的一切。

(Reddit 讨论线程:https://www . Reddit . com/r/androiddev/comments/5h0er 6/Eli 5 what does squares flow library do/)

黑客中午是黑客如何开始他们的下午。我们是阿妹家庭的一员。我们现在接受投稿并乐意讨论广告&赞助机会。

如果你喜欢这个故事,我们推荐你阅读我们的最新科技故事趋势科技故事。直到下一次,不要把世界的现实想当然!

https://upscri.be/hackernoon/


本站为非盈利网站,作品由网友提供上传,如无意中有侵犯您的版权,请联系删除