听起来你对这些概念有了相当不错的掌握。我已经用过几次Activities/Places API,但我仍然觉得有点困惑。以下是另一个关于组件的概述:
PlaceController - 你使用它告诉ActivityManager下一步要过渡到哪里,使用goTo方法。
ActivityManager - 管理运行的活动。调用start、stop、show等方法。
ActivityMapper - 把它看作一个工厂。根据给定的地点,它知道要创建哪个Activity。这通常是我注入RPC服务的地方。
Place - 将其视为应用程序中特定视图的“地址”。PlaceTokenizer通常在此处指定,但这更像是方便之举。
PlaceHistoryMapper - 这是将url令牌并使用您指定的PlaceTokenizers创建一个Place的类。
Activity - 活动代码应该能够接受一个Place对象,并将您的应用程序带到那个位置。如果两个Place对象相同,则每次都应该显示相同的内容。
这是我写的一个测试应用程序示例,它使用了Activities Places(活动位置)。我有两个部分的应用程序使用了这个功能:
https://github.com/aglassman/jgoo/tree/master/JGoo/src/com/jgoo/client/appnav
https://github.com/aglassman/jgoo/tree/master/JGoo/src/com/jgoo/client/crud/nav
Activities Places 的设置在这里:
https://github.com/aglassman/jgoo/blob/master/JGoo/src/com/jgoo/client/CrudLauncher.java
这是测试应用程序的演示,您可以看到我使用PlaceTokenizers的不同方式来获取不同的视图。(请注意,数据存储有时需要几秒钟才能初始化,因此如果你点击“Get All”,它可能需要一段时间才能加载(没有加载旋转器,但它正在工作中)。如果你点击结果文本,它会带你到对象的视图。
http://jgoo-sample.appspot.com/
希望这有所帮助!更新:添加了活动示例,说明它如何与MVP相关。在下面的示例中,PlaceTokenizer提供了一个活动类型,如果请求编辑,则提供UUID以映射到特定联系人。我使用Activity作为高级Presenter,几乎只是为了向较低级别的Presenter提供初始数据和信息,以便它能够完成工作。在较低级别的Presenter中,在本例中为RequestEditWidget和ContactInfoWidget,我使用UIBinder创建视图。请注意,我目前没有一种方法让Activity使用mayStop/onStop方法,但这只是需要一些额外代码来与我的小部件进行接口交互的问题。这些(编辑、订阅、请求编辑)中的每一个都可以成为自己的Activity,但我希望它们都具有相同的place前缀。
package contactmanager.client.nav;
import contactmanager.client.ContactManagerServiceAsync;
import contactmanager.client.callback.BasicCallback;
import contactmanager.client.contact.info.ContactInfoWidget;
import contactmanager.client.contact.info.RequestEditWidget;
import contactmanager.shared.bundle.InitDataBundle;
import com.google.gwt.activity.shared.AbstractActivity;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.place.shared.PlaceController;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
public class ContactActivity extends AbstractActivity{
public enum Activity {
request_edit,
edit,
subscribe
}
private ContactManagerServiceAsync cmsa;
private ContactPlace place;
private PlaceController pc;
public ContactActivity(PlaceController pc, ContactManagerServiceAsync cmsa,ContactPlace place)
{
this.pc = pc;
this.cmsa = cmsa;
this.place = place;
}
public void start(AcceptsOneWidget panel, EventBus eventBus) {
switch(place.activity)
{
case request_edit:
loadRequestEditPanel(panel);
break;
case edit:
loadEditPanel(panel);
break;
case subscribe:
loadSubscribePanel(panel);
break;
}
}
private void loadSubscribePanel(final AcceptsOneWidget panel) {
cmsa.getInitDataBundle(new BasicCallback<InitDataBundle>() {
@Override
public void onSuccess(InitDataBundle result) {
panel.setWidget(new ContactInfoWidget(pc,cmsa,result,null).getWidget());
}
});
}
private void loadRequestEditPanel(final AcceptsOneWidget panel) {
panel.setWidget(new RequestEditWidget(pc,cmsa).getWidget());
}
private void loadEditPanel(final AcceptsOneWidget panel) {
cmsa.getInitDataBundle(new BasicCallback<InitDataBundle>() {
public void onSuccess(InitDataBundle result) {
panel.setWidget(new ContactInfoWidget(pc,cmsa,result,place.uuid).getWidget());
}
});
}
}