2010-06-17 46 views
1

我正在GWT中做一个程序。这里是林有问题引用内部类中的非最终变量数据

private String[] populateRSSData() { 
    1==>> String[] data = null; 
    try { 
    new RequestBuilder(RequestBuilder.GET, 
    "../database.php?action=populaterss").sendRequest(null, 
    new RequestCallback() { 

     @Override 
     public void onResponseReceived(Request request, 
     Response response) { 
     2==>> data=response.getText().split("~"); 
     } 

     @Override 
     public void onError(Request request, Throwable exception) { 
     Window.alert(exception.getMessage()); 
     } 
    }); 
    } catch (RequestException e) { 
    Window.alert(e.getMessage()); 
    } 

    return data; 
} 

片断现在出现的问题是,我得到这个变量1==>>data应声明final错误。但是,如果我把它声明为final然后我不能DATAS存储在2==>>

的错误,我得到

Cannot refer to a non-final variable data inside an inner class defined in a different method RSS_Manager.java

请建议

回答

7

即使您设法克服错误,该函数也不会执行您打算执行的操作。 当您的方法populateRSSData()将立即返回时,您正在创建的回调会异步通知从服务器收到的响应。

您需要重新考虑将异步考虑在内的设计。

编辑:看到Getting Used to Asynchronous Calls

编辑:从上面的链接

重要的问题,了解 报价是那后面的RPC调用的代码将被同时执行到服务器的实际往返仍在进行中。尽管onSuccess()方法内部的代码是与调用内联定义的,但直到调用代码返回到JavaScript主循环并且服务器返回结果消息后才会执行。

+0

+1塔希尔是正确的。您的方法将始终返回null,因为异步调用的结果尚未分配......请执行您需要使用onResponseReceived();)中的数据 – Bogdan 2010-06-17 07:30:00

+0

dint从该角度思考。谢谢塔希尔,我需要重新设计结构 – Sam 2010-06-17 07:58:24

0

您应该使数据变量类成员(如可能),或者用一些声明为final的对象包装它。

本地内部类中使用的变量必须声明为final。另见:method local innerclasses accessing the local variables of the method

- EDIT--

塔希尔阿赫塔尔指出了一件非常重要的事情。除了我提到的一般观点之外,您的设计中还存在缺陷 - 回调用于异步响应。该方法终止后,响应可能会很久到,所以结果将不会被分配。

0

您需要为data使用不同的数据结构,这是可变的 - 您可以修改final变量,但不能分配给它。也许java.util.Vector或类似的将适合您的需求在这里。

3

一个简单的方法 - 声明data作为字符串列表并使列表最终。你总是可以将元素添加到最终列表中(你只能将最后一个变量赋给不同的列表)。

因此,对于你的代码:

private String[] populateRSSData() { 
    final List<String> data = new ArrayList<String>(); 
    try { 
    new RequestBuilder(RequestBuilder.GET, 
    "../database.php?action=populaterss").sendRequest(null, 
    new RequestCallback() { 

     @Override 
     public void onResponseReceived(Request request, 
     Response response) { 
     data.addAll(Arrays.asList(response.getText().split("~")); 
     } 

     @Override 
     public void onError(Request request, Throwable exception) { 
     Window.alert(exception.getMessage()); 
     } 
    }); 
    } catch (RequestException e) { 
    Window.alert(e.getMessage()); 
    } 

    return data.toArray(new String[data.size()]); 
} 
相关问题