JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » AJAX討論區 » GWT  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to postflat modego to previous topicgo to next topic
本主題所含的標籤
作者 恭賀GTW子版成立,順便說說RunAsyncCallback
kentyeh





發文: 647
積分: 6
於 2010-06-23 12:14 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
主要恭賀GTW子版成立,順便把年初寫的一篇文件貼上。
根據GWT 文件的說法,可以將部分功能性代碼獨立成單一模組,直到用到時才下載這部分的代碼,這是利用GWT 2.0的新的技術Code Split 的技術來達成,用淺明的說法就是 --- 把某個Object程式碼分割成單一模組,等到需要時,才以非同步方式下載建立,這是為了解決GWT過大時,載入太慢的問題。
首先,我將建立兩個基礎Interface與一個抽象class。

第一個是非同步Object的提供者
1
2
3
4
public interface AsyncProvider<T> {
  T getInstance();
  void createAsync(final AsyncProviderCallback<T> callback);
}
其中的T是我們要以非同步建立的Object類別,getInstance()負責建立所需的T類別Object,而createAsync()則是實做非同步提供Object的過程,待會,我們會建立一個抽象類別AbstractAsycProvider<T>直接實做這個funciton

第二個Interface,是Client端用來建立Object叫用的程式function
1
2
3
4
public interface AsyncProviderCallback<T> {
  void onSuccess(T instance);
  void onUnavailable(Throwable e);
}

onSuccess()是非同步函式建立Object成功時所呼叫,並回傳成功建立,而onUnavailable()則是無法建立Object時所通知叫用,等下我會提供使用範例
再來我們看看是AbstractAsycProvider<T>如何實做非同步的提供:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public abstract class AbstractAsycProvider<T> implements AsyncProvider<T>  {
  public void createAsync(final AsyncProviderCallback<T> callback) {
    GWT.runAsync(new RunAsyncCallback() {
      @Override
      public void onSuccess() {
        try{
          callback.onSuccess(getInstance());
        }catch(RuntimeException e){
          callback.onUnavailable(e);
        }
      }
      @Override
      public void onFailure(Throwable reason) {
        callback.onUnavailable(reason);
      }
    });
  }
}


老實說,這段程式碼照抄就可以了,因為非同步建立Object的步驟都是一樣的,好了,我希望在程式中動態下載並建立地圖物件MapWidget,茲以建立一個呈現我家地圖的Object範例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
public class MyHomeMap extends HTMLPanel implements AsyncProvider<MapWidget>,
        AsyncProviderCallback<MapWidget>{
  private MapWidget map = null;
  public MyHomeMap() {
    super("<span id=\"MyHomeMap\"/>");
  }
  @Override
  protected void onAttach() {
    //真正載入時建立地圖Object
    super.onAttach();
    createAsync(this);
  }
  @Override
  public MapWidget getInstance() {
    if(map==null){
      //建立地圖Object
      map = new MapWidget(LatLng.newInstance(22.5735440,120.2973880),13);
      map.setSize("300px", "300px");
      map.addControl(new LargeMapControl());
      //將地圖Object加到HtmlPanel
      add(map,"MyHomeMap");
    }
    return map;
  }
  /* 
   * 非同步建立地圖Object---直接從AbstractAsyncProvider抄過來
   */
  @Override
  public void createAsync(final AsyncProviderCallback<MapWidget> callback) {
    GWT.runAsync(new RunAsyncCallback() {
      @Override
      public void onSuccess() {
        try{
          callback.onSuccess(getInstance());
        }catch(RuntimeException e){
          callback.onUnavailable(e);
        }
      }
      @Override
      public void onFailure(Throwable reason) {
        callback.onUnavailable(reason);
      }
    });
  }
  @Override
  public void onSuccess(MapWidget instance) {
    //地圖Object建立完成時加標記
    instance.addOverlay(new Marker(instance.getCenter()));
  }
 
  @Override
  public void onUnavailable(Throwable e) {
    //善後處理
    Window.alert("建立我家地圖失敗:"+e.getMessage());
  }
}


Example code
1
2
3
4
5
6
public class MyAsyncMapDemo implements EntryPoint {
  @Override
  public void onModuleLoad() {
    RootPanel.get().add(new MyHomeMap());
  }
}


reply to postreply to post
話題樹型展開
人氣 標題 作者 字數 發文時間
1787 恭賀GTW子版成立,順便說說RunAsyncCallback kentyeh 3160 2010-06-23 12:14
1349 Re:恭賀GWT子版成立,順便說說RunAsyncCallback worookie 35 2010-06-23 13:37
1447 Re:恭賀GWT子版成立,順便說說RunAsyncCallback koji 17 2010-06-23 14:11
» JWorld@TW »  AJAX討論區 » GWT

reply to postflat modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8