Friday, July 19, 2013

Where to initialize an AsyncDataProvider?

Hi everybody,
I have a short but painful question: Where is the right place to initialize my AsyncDataProvider?

Story so far: 
In my Controller class I have my AsyncDataProvider as reference and the search method where I built the asynchronous callback and process my data, looks like this.

private final ClientServiceAsync service = GWT.create(ClientService.class);  private AsyncDataProvider<Model> provider;  private List<Model> dataList = new ArrayList<Model>();    // other stuff here...    void search(final TO_Search pSearchCriteria) {        // Associate an async data provider to the table      provider = new AsyncDataProvider<Model>() {            @Override          protected void onRangeChanged(HasData<Model> display) {              final int start = display.getVisibleRange().getStart();              int length = display.getVisibleRange().getLength();                // Get the ColumnSortInfo from the table.              final ColumnSortList sortList = view.cellTable.getColumnSortList();              final ColumnSortInfo sortInfo = sortList.get(0);              final String dataStoreName = sortInfo.getColumn().getDataStoreName();              final boolean isAscending = sortInfo.isAscending();                AsyncCallback<TO_Result> callback = new AsyncCallback<TO_Result>() {                  @Override                  public void onFailure(Throwable caught) {                      Window.alert(caught.getMessage());                  }                    @Override                  public void onSuccess(TO_Result data) {                        if (!GWT.isProdMode()) {                          GWT.log(this.getClass() + ": Remote Procedure Call - Success");                          GWT.log(this.getClass() + ": No. of results = " + data.getCount());                      }                        if (data.getCount() != 0) {                            dataList.addAll(data.getResults());                            updateRowData(start, data.getResults());                          updateRowCount(data.getCount(), true);                            if (data.isGoToFirstPage()) {                              view.setPagerFirstPage();                          }                        } else {                            dataList.clear();                          updateRowData(start, dataList);                          updateRowCount(data.getCount(), true);                            view.simplePopup.setWidget(new HTML(CONSTANTS.noSearchResults()));                      }                          }              };              service.search(searchCriteria, start, length, dataStoreName, isAscending, callback);          }      };  } // end search()

This solution works very well, most of time. Sometimes it shows a very strange behavior and comes up with old search results. And it looks absolutely wrong for me that the AsyncDataProvider is always new created for every search.
Until now I have no other idea, how I could do this, because in the end, I need to call my service, which is defined in the AsyncDataProvider.

Is this the right design? 

Thanks a lot in advance. 

Best regards

 Jochen

--
You received this message because you are subscribed to the Google Groups "Google Web Toolkit" group.
To unsubscribe from this group and stop receiving emails from it, send an email to google-web-toolkit+unsubscribe@googlegroups.com.
To post to this group, send email to google-web-toolkit@googlegroups.com.
Visit this group at http://groups.google.com/group/google-web-toolkit.
For more options, visit https://groups.google.com/groups/opt_out.
 
 

No comments:

Post a Comment