如果打开服务器端口,我需要运行服务。我正在使用以下方法进行此操作。
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:启动超时已经过期,放弃了唤醒锁!
启动该服务后,应用程序运行良好。我如何摆脱这个问题?预先感谢。
据我了解,一项研究后,
Android应用程序被吊死,并显示黑屏5-6秒,因为,
未来 -
未来代表了异步计算的结果。提供方法以检查计算是否完成,等待其完成并检索计算结果。
因此,它等到操作完成。您可以从这里获得更多信息。
newFixedThreadPool -
在任何时候,大多数Nthreads线程将是主动处理任务。如果在所有线程处于活动状态时提交其他任务,则它们将在队列中等待直到线程可用。
从这里获取更多信息。
您问题的可能解决方案是使用计划的ExecutorService。
在此之前,您可以检查未来是否完成或不使用
if (YOUR_FUTURE.isDone()){
result = (String) YOUR_FUTURE.get();
}
避免不需要或额外的循环。