检索数据时,带有 ArrayList<SomeClass> 的 gwt asyncCallback 失败

Posted

技术标签:

【中文标题】检索数据时,带有 ArrayList<SomeClass> 的 gwt asyncCallback 失败【英文标题】:gwt asyncCallback with ArrayList<SomeClass> fails when retrieving data 【发布时间】:2012-03-20 08:13:15 【问题描述】:

我正在尝试为我的进一步工作制作示例代码。我正在使用 gwt vanillia 和新的 gwt。我的目的是填充一些文本框和网格。对于从数据库填充文本框,rpc 调用没有问题。但我无法通过使用 RPC 调用来填充数据网格。我用Bastian Tenbergen's tutorial 用于填充一些文本框。但是当我尝试使用 ArrayList 使用异步回调填充网格时,代码失败了。我知道 ArrayList 也是可序列化的,但我无法解决这个问题。 任何建议表示赞赏。 这是我的questin的一些代码。 在服务器包中:SqlDbConnection.java

    public ArrayList<hastaGrid> callGrid(String something)
    ArrayList<hastaGrid> list = new ArrayList<hastaGrid>();
    hastagrid hastaGrid = null;     
    try 
        Statement st = conn.createStatement();
        ResultSet result = st.executeQuery("select name from TEST where name = '"+ something +"'");

        while(result.next()) 
            hastagrid = new hastaGrid(result.getString(1), result.getString(2),result.getNString(2),result.getString(3));
            list.add(hastaGrid);
            System.out.println("result: " +hastagrid.getLogin().toString()+" " + hastagrid.getPassword() +" "+ hastagrid.getName() +" " + hastagrid.getSurname());
        
        result.close();
        st.close();                 
     catch (Exception e) 
        e.printStackTrace();
           
    return list;

在客户端包中:hastaGrid.java //该类也有getter和setter方法。

public class hastaGrid implements IsSerializable 

private String name;
private String surname;
private String login;
private String password;

public hastaGrid(String name,String surname, String login, String password)
    this.setName(name);
    this.setSurname(surname);
    this.setLogin(login);
    this.setPassword(password);

在客户端包中:DBConnection.java

public interface DBConnection extends RemoteService    
public ArrayList<hastaGrid> callGrid(String name);  

在客户端包中:DBConnectionAsync.java

public interface DBConnectionAsync     
public void callGrid(String name, AsyncCallback<ArrayList<hastaGrid>> callback);   

在客户端包中:userDetail.java

onModuleLoad() AsyncCallback> 回调 = 新的 AuthenticationHandler1(); rpc.gridGetir("John",callback);

private class AuthenticationHandler<T> implements AsyncCallback<ArrayList<hastaGrid>>  
    public void onFailure(Throwable ex) 
    RootPanel.get().add(new html("RPC call failed"));
    
    public void onSuccess(ArrayList<hastaGrid> result)         
    result.get(0).getName();   // I just want to reach some result here when debugging.

我在网上阅读了很多网页,但找不到具体的解决方案。我可能是错的。感谢您的回复。

【问题讨论】:

【参考方案1】:

首先,您应该确保您的 RPC 返回适当的 hastaGrid 对象列表 - 请务必将类名大写 :) 我经常使用AsyncDataProvider 模型和各种DataGrid 实现,并创建一个类似于以下的实现类:

public class MyProvider extends AsyncDataProvider<MyModelObject> implements AsyncCallback<List<MyModelObject>> 
    static int PAGESIZE = 50;
    List<MyModelObject> cache = new ArrayList<MyModelObject>();

    @Override
    protected void onRangeChanged(HasData<MyModelObject> display) 
        final Range range = display.getVisibleRange();          
        int start = range.getStart();
        int end = start + range.getLength();
        if (start >= cache.size() - 1) 
            lastVisible = cache.size() - 1;
            gwtService.fetchRowsFromDbase(this);                
            return;
        
        List<MyModelObject> dataInRange = cache.isEmpty() ? new ArrayList<MyModelObject>() : cache.subList(start,
                end >= cache.size() ? (cache.size()) : end);
        updateRowData(start, dataInRange);
    

    public void onFailure(Throwable caught) 
        Window.alert(caught.getMessage());
    

    public void onSuccess(List<MyModelObject> result) 
        if (result.isEmpty()) 
            //display a warning
            return;
        
        for (MyModelObject a : result) 
            if (cache.indexOf(a) == -1)
                cache.add(a);
        
        updateRowData(cache.indexOf(result.get(0)), result);
        updateRowCount(cache.size(), result.size() < PAGESIZE);
        tab.setPageSize(PAGESIZE);
        tab.setPageStart(lastVisible);
        MyModelObject last = cache.get(cache.size() - 1);
        orderOffset = last.getId();         
    

    public List<MyModelObject> getCache() 
        return cache;
    

在您放置的 DataGrid 初始化代码中:

MyProvider pr = new MyProvider();
pr.addDataDisplay(yourDataGrid);

如果您还添加了寻呼机,则此方法效果最佳,因为数据提供程序会侦听范围更改,由单击寻呼机触发。

SimplePager pager = new SimplePager();
pager.setDisplay(yourDataGrid);
//don't forget to add the pager widget to the DOM 

希望这会有所帮助!

【讨论】:

感谢您的建议。我只是按照你说的做了。然后 volia .. 也感谢代码示例。我将尝试以这种方式实现。对于班级名称,我同意你的看法:) @Jasper 变量 orderOffset 有什么用? orderOffset 是我从中获取此示例的类中的一个字段,只是为了跟踪获取的最后一个 Id。

以上是关于检索数据时,带有 ArrayList<SomeClass> 的 gwt asyncCallback 失败的主要内容,如果未能解决你的问题,请参考以下文章

将检索到的值加载到 listView 时应用程序崩溃

如何一次将从 Firebase 检索到的数据存储在 ArrayList<String> 中?

例外:从意图存储ArrayList时“无法转换为java.util.ArrayList”

Android:使用 ArrayList 从 Firebase 检索对象

哪个更快 - 游标或 ArrayList?

从 hashmap 存储和检索 ArrayList 值