如何从一个地方到另一个地方获得一个物体?
例如,我有一个ContactsView,其中包含Contacts表和相应的ContactsActivity / Place类。如果我想编辑联系人,请单击表格行并转到ContactEditorPlace。 ContactEditorView如何让联系人进行编辑?
我见过的例子似乎表明没有在Place中传递实际的对象引用,而是它们会遇到传递String或id的麻烦(例如,Expenses示例)。除了简单的标记化之外,还有其他原因吗?是否有某种原因引用不应该放在一个地方?
如果未在ContactEditorPlace的构造函数中设置对象引用,那么它是如何进入ContactEditorActivity的?这可以通过EventBus来完成,但是将单个引用传递给单个活动会有很多样板。
我想说我没有使用RequestFactory。
答案 0 :(得分:5)
在我看来:
在地方的构造函数中传递对象引用没有问题。这样,您可以在单击要编辑的行时轻松传递Contact引用。
然而,将整个对象用作令牌可能不是一个好主意。我认为最好使用它的id,然后在去除声明时从id中获取对象并将其传递给构造函数。
就费用示例而言,我相信这是因为他们使用具有那些实体定位器的请求工厂,可以根据他们的ID轻松获取实体。
答案 1 :(得分:2)
如果您想要分离的地方,那么您可以创建封装对象的自定义事件,然后通过事件总线传递此事件。
<强>更新强>
历史/地方支持是通过片段标识符完成的(这是官方术语,谷歌称之为历史记录或放置令牌)。通过解析FI(标记化)来创建场所。您可以按照自己喜欢的方式格式化FI,但限制是它们是字符串。 FI格式可以是任何内容(例如#place / subplace:arg1:arg2)。您的tokenizer的工作是解析FI并创建Place。
在您的情况下,FI可以是#contactedit:id。因此,您的标记生成器将解析此标记,创建包含要编辑的联系人ID的ContactEditorPlace。
答案 2 :(得分:1)
Place旨在表示历史记录。在该上下文中,Place对象中的值将成为应用程序URL的一部分。这意味着用户可以随时将URL放入浏览器中,并从该URL重建Place对象。当您传递对象引用时,当用户只传递URL时,该对象不存在。作为一般规则,我总是使用放置在Place对象中的值应该仅用于唯一地标识或重新创建应用程序的特定状态而没有值只是因为通过位置传递值很容易。
在这种情况下,您可以在Place中传递对象的id,并从您保存在应用程序中的某个缓存中获取对象(如果它不在缓存中则进入服务器)或直接从服务器获取对象。