如果服务器端口打开,我需要运行一个服务。我正在用下面的方法来做这件事。
public Future<Boolean> ifPortIsOpenThenStartIridiumService(final Context context, final String device_mac, final String device_imei, final String input_mobile) {
return Executors.newFixedThreadPool(20).submit(new Callable<Boolean>() {
@Override
public Boolean call() {
try {
String SERVER_IP = "IP Address";
int SERVER_PORT = Server_port;
int DURATION = 1000;
Socket socket = new Socket();
socket.connect(new InetSocketAddress(SERVER_IP, SERVER_PORT), DURATION);
socket.close();
Log.d(TAG, "Port is Open");
runIridiumService(context, device_mac, device_imei, input_mobile);
return true;
} catch (Exception ex) {
Log.d(TAG, "Port is not Open");
CustomToast.showToast(context, "No Internet Access.", "If in flight, please switch to \"Aeroplane Mode\" and connect to the airline's Wi-Fi network.", 1);
return false;
}
}
});
}上面的代码是有效的,但是当我运行这个方法时,应用程序被挂起,黑色屏幕显示了5-6秒。我在Logcat上发现了下面的消息。
W/ActivityManager:启动超时已经过期,放弃了唤醒锁!
该服务启动后,应用程序运行良好。我怎样才能解决这个问题?提前谢谢。
发布于 2017-06-06 09:45:08
经过一些研究,据我所知,
Android应用程序挂起并显示黑色屏幕5-6秒,因为,
未来-
未来表示异步计算的结果。提供了检查计算是否完成、等待其完成和检索计算结果的方法。
所以,它一直等到操作完成。你可以得到更多的信息从这里开始。
newFixedThreadPool -
在任何时候,最多的nThreads线程都是活动的处理任务。如果在所有线程都处于活动状态时提交了其他任务,它们将在队列中等待,直到线程可用为止。
获取更多信息从这里开始。
解决问题的可能方法是使用ScheduledExecutorService。
在此之前,您可以检查未来是否已完成或未使用
if (YOUR_FUTURE.isDone()){ result = (String) YOUR_FUTURE.get(); }
避免不必要的或额外的循环。
https://stackoverflow.com/questions/44352674
复制相似问题