2012-08-22 50 views
6

更新地點變更活動狀態的最佳做法是什麼?想象一下,您有一個視圖活動,顯示類別列表和類別中的項目列表。如果選擇不同的類別,則應用程序會轉到具有類別ID的新位置。然後,我只想刷新項目,而不是創建也重新讀取類別列表的新活動。GWT MVP更新活動狀態地點變更

我目前的做法是這樣的:

public class AppActivityMapper implements ActivityMapper { 

    private ItemListActivity itemListActivity; 

    ... 

    public Activity getActivity(final Place place) { 
     final Activity activity; 

     if (place instanceof ItemListPlace) { 
      if (itemListActivity == null) { 
       itemListActivity = new ItemListActivity((ItemListPlace) place, clientFactory); 
      } else { 
       itemListActivity.refresh((ItemListPlace) place); 
      } 
      activity = itemListActivity; 
     } else { 
      itemListActivity = null; 
     } 

     ... 
     return activity; 
    } 

    ... 

回答

5

,選項爲:

  • PlaceChangeEvent■從活動中(那麼你可以使用一個FilteredActivityMapperCachingActivityMapper緩存您的ActivityMapper中的活動,以便它被縮減爲僅在被詢問時才創建新活動)。 †

  • 有一定的分量聽PlaceChangeEvent S和其轉化到面向企業的活動,活動然後偵聽到這些事件,而不是PlaceChangeEvent S,否則上面一樣。

  • 解耦「屏幕」的活性,使「屏幕」與reset()方法的單和呼叫從該活動的start該方法(可能傳遞類別ID作爲這種情況下的參數)。作爲一個單身人士的「屏幕」可以確保只加載一次類別列表。

  • 對於您的情況,您也可以簡單地將類別列表放入共享緩存中,以便您不必重複使用可以創建新類別的活動,類別列表將被檢索一次並放入緩存,後續活動實例將只使用緩存中的內容。這與上述類似,但更簡單,緩存可以被應用程序的其他部分使用。

我個人使用自己的方法去,但(與小例外,見下文),因爲它是最簡單的/最簡單的。將活動與「屏幕」分離也是一種選擇; GWT團隊開始在費用樣本中探索這種方法(使用MVP將活動責任與演示者責任分開),但不幸的是完成它。

除此之外,我不認爲任何最佳實踐現在確實已經出現。


†。我不喜歡將我的活動與他們使用的地方聯繫起來(我不太喜歡goTo調用的耦合,但還沒有找到乾淨而簡單的替代方案),所以我寧願不要與這個選項一起去;同樣地,我也不會將這個地方傳遞給活動構造函數和方法,而是將這些信息從該地方提取出來並傳遞給活動(例如,在您的情況下,只將活動類別ID賦予活動,而不是ItemListPlace實例;然後我會在所有情況下直接調用setCategory,甚至不會將類別ID傳遞給構造函數)。

1

我不會在我的ActiviyMapper中做任何邏輯,除了通過創建一個新的或者給出一個前一個(或者爲null)來返回一個活動。據我所知,mapper不必知道refresh()或者什麼活動。

如果是,那麼該邏輯「刷新()」將通過其保持的令牌的地方賦予activy。該令牌應該保存關於請求狀態(新頁面,重新加載,ID等)的信息。

在活動中,首先它要求查看,與此活動相關的查看(提示:由'ClientFactory'給出的單例是很好的做法),然後爲該視圖創建一個演示者,並將它們綁定一起。

最後,該活動將使用令牌從地方提供有關狀態主持人的任何信息。然後,它在頁面中添加視圖。

這是很好的默認情況下就知道了,地點和活動比較,去同一個地方不會做任何事情(不重裝)。但您可以輕鬆地使用令牌和活動映射器來處理它。

希望你會發現你的情況適合的解決方案。祝你好運。

3

在我看來,

  • ActivityMapper的作用是讓你從一個Place回一個Activity
  • ActivityManager的作用是開始給出從ActivityMapperActivity,如果不同停止當前之一。在你的情況下,你想「更新/刷新」當前Activity

所以我會修改ActivityMapper從而將永諾給我回的Activity相同的實例給定類型的Place。一個好的方法是使用GIN並使用單例範圍...in(Singleton.class)來注入您的Activity

如果你這樣做,當更改網址時,如果地方保持不變(即你的網址在#和之前有同一個單詞:)以便你的地點的類型保持不變,ActivityMapper會給你返回Activity的同一個實例,因此ActivityManager將不會對Activity執行任何操作。檢查l126的ActivityManager

if (currentActivity.equals(nextActivity)) { 
    return; 
} 

對我來說你有2個選項。正如托馬斯所說,第一個是在你的Activity中收聽PlaceChangeEvent。您將收到新的Place根據給定的新網址可以有新的參數,您可以「更新/刷新」您的Activity

第二個,我發現更符合活動/地點圖案線是修改ActivityManager,以便它呼籲Activity的更新(地點)方法時,由ActivityMapper給定回Activity是相同的那目前Activity

我還沒有嘗試過任何這些解決方案的,但是我會很快......我也許可以更新後在那個時候。

You can find more information in this article I wrote on my blog on that topic

這裏是我提出來幫我瞭解的格局有點架構,希望這將有助於:

enter image description here

+0

你嘗試第二個解決方案?它是如何工作的,或者你找到了一個更好的方法來做到這一點? – displayname

+0

對不起。 :(Nerver真的有需要,我們只需用新的參數重新加載活動 –

+0

好吧,我只是想它是Marting做的,我不確定是否這個規模,但我要求它把instanceof MainActivity',如果是這樣,而不是null,我只需要調用'mainActivity.updateMainContent(place.getCurrentPlaceToken())'來更新我的菜單中的一個按鈕點擊後的主要內容。更新主要內容,但它是.. – displayname