2014-01-15 173 views
0

我在Eclipse Juno上使用GWT 2.5.1和Ext GWT v2.2.4运行GWT应用程序。 Java 6(32位),我不能改变任何这一点。由于内部无限循环,GWT应用程序冻结

我最近把这个应用程序交给了另一台机器,它工作正常。启动应用程序(运行> GWT应用程序)后,我继续登录到我的应用程序,我的代码正常执行,但然后我的应用程序冻结。我调试,发现应用进入无限循环在此GWT内部方法(即,在com.google.gwt.dev.shell.BrowserChannelServer类):

public void reactToMessages(SessionHandlerServer handler) { 
    do { 
     try { 
     getStreamToOtherSide().flush(); 
     MessageType messageType = Message.readMessageType(
      getStreamFromOtherSide()); 
     switch (messageType) { 
      case FREE_VALUE: 
      final FreeMessage freeMsg = FreeMessage.receive(this); 
      handler.freeValue(this, freeMsg.getIds()); 
      break; 
      case INVOKE: //<<<< Keeps getting into this block 
      InvokeOnServerMessage imsg = InvokeOnServerMessage.receive(this); 
      ExceptionOrReturnValue result = handler.invoke(this, imsg.getThis(), 
       imsg.getMethodDispatchId(), imsg.getArgs()); 
      sendFreedValues(); 
      ReturnMessage.send(this, result); 
      break; 
      case INVOKE_SPECIAL: 
      handleInvokeSpecial(handler); 
      break; 
      case QUIT: 
      return; 
      default: 
      throw new RemoteDeathError(new BrowserChannelException(
       "Invalid message type " + messageType)); 
     } 
     } catch (IOException e) { 
     throw new RemoteDeathError(e); 
     } catch (BrowserChannelException e) { 
     throw new RemoteDeathError(e); 
     } 
    } while (true); 
} 

messageType总是INVOKE并且由于当条件为,循环永远不会结束。所以执行是停留在这个堆栈:

Daemon Thread [Code server for av.mymodule from Mozilla/5.0 (Windows NT 6.1; WOW64; rv:26.0) Gecko/20100101 Firefox/26.0 on http://127.0.0.1:8889/mymodule.html?gwt.codesvr=127.0.0.1:9997 @ tsb2t8vtLUT/vrj#] (Suspended) 
      BrowserChannelServer.reactToMessages(BrowserChannelServer$SessionHandlerServer) line: 292  
      BrowserChannelServer.processConnection() line: 547 
      BrowserChannelServer.run() line: 364 
      Thread.run() line: 662 

我清理项目,删除缓存文件,.tmp文件,重新编译了无数次,试过旧版本2.4.0,但我不能尝试2.6,因为我会需要目前无法安装的java 7。我尝试过Chrome和Firefox,结果相同。经过一番搜索之后,我发现了一些建议,我不应该放大使用浏览器,但是,我没有这样做。

请问有什么问题?

回答

0

我觉得你的条件应该是动态变量而不是使用真正。你应该跳出做while循环。如果不是,你的执行可能会叠加。

public class TestDoWhile { 
private static TestDoWhile test; 

public static void main(final String[] args) { 
    test = new TestDoWhile(); 
    test.invokeMethod(2); 
    test.invokeMethod(1); 
} 
public final void invokeMethod(final int testCase) { 
    do { 
     switch (testCase) { 
     case 1: 
      System.out.println("Invoke"); 
      break; 
     case 2: 
      System.out.println("Please , let me quit !"); 
      return; 
     default: 
      return; 
     } 
    } while (true); 
} 
} 

我的java程序的结果是什么?这可能会叠加。我无法想象你的这两种方法 sendFreedValues(); ReturnMessage.send(this,result);

因此,添加回报,而不是突破。对你有一些帮助。

+0

正如我所提到的,这是一个内部的GWT代码。我无法修改它。如果行为不当,那么有些事情是非常错误的。这可能是一个我非常怀疑的GWT错误,但即使如此,只有GWT团队才能解决它,因为我对GWT内部知识一无所知。 –

+0

@MuhammadGelbana我很抱歉!如果是这样,你应该复制它的源代码并创建自定义小部件或类,然后再次测试它。有时GWT会给我一些错误,还有一些不足之处。我不知道GWT 2.6。 – Cataclysm

1

问题是分机GWT 2.2.4不与GWT 2.5.1兼容,但它是兼容GWT 2.5.0

因此,使用GWT 2.5.0代替,解决了这个问题。

+0

是的,感谢有用的知识。我使用GWT 2.5.1。 (版本.1)被击中你:) – Cataclysm