当检查服务器端口是否打开是否使用ThreadPoolExecutor时,Android应用程序被挂起并显示黑屏5-6秒



如果打开服务器端口,我需要运行服务。我正在使用以下方法进行此操作。

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(); }

避免不需要或额外的循环。

相关内容

  • 没有找到相关文章

最新更新