【发布时间】:2014-06-19 16:08:24
【问题描述】:
我有一个AsyncTask,我用它来创建一个Socket 连接。在我的doInBackground() 方法中,我有:
Socket socket = new Socket(HOST_NAME, PORT_NUMBER);
就我而言,当我尝试通过蜂窝网络连接时,这行代码会挂起。它永远不会完成执行,最终应用程序崩溃。因为来自Server 的信息对我来说是必要的,所以我做了这样的事情:
AttemptConnection attemptConnection = new AttemptConnection(); // this is the AsyncTask
attemptConnection.execute().get();
现在我意识到这很糟糕,因为AsyncTask 的目的是与主线程并行运行,这会暂停主线程上的处理。但是,在获取来自服务器的信息之前,我的应用程序无法真正去任何地方,所以我有点需要这个 AsyncTask 来完成。
由于Socket 连接失败并挂起一些时间,在某些情况下这会导致我的设备冻结并最终导致我的应用程序崩溃。所以我想要更好的东西。我想出的解决方案是:
attemptConnection.execute();
try {
Thread.sleep(3000);
} catch (Exception e) {
}
attemptConnection.cancel();
但我想知道这是否更好?我无法在内部取消该过程,因为永远无法到达应该捕获Socket 连接错误的try / catch。代码挂在那里,没有发现任何错误。但是上面的想法似乎也是一种非常老套的方法。我想知道这种方法是否像我的直觉告诉我的那样糟糕,如果是,有什么更好的方法来处理这个问题?
【问题讨论】:
标签: android multithreading sockets android-asynctask