Android application is hanged and showing black screen for 5-6 seconds when checking if a server port is open or not using ThreadPoolExecutor

我的未来我决定 提交于 2019-12-13 00:12:43

问题


I need to run a service if a server port is open. I am doing this by using below method.

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

Above code is working but when I run this method the application is getting hanged and black screen is shown for 5-6 seconds. I found below message on Logcat.

W/ActivityManager: Launch timeout has expired, giving up wake lock!

After that service is started and application is working well. How can I get rid of this problem? Thanks in advance.


回答1:


After some study, as far as I understood,

Android application is hanged and showing black screen for 5-6 seconds Because,

Future -

A Future represents the result of an asynchronous computation. Methods are provided to check if the computation is complete, to wait for its completion, and to retrieve the result of the computation.

So, it waits until operation is finished. You can get more info from here.

newFixedThreadPool -

At any point, at most nThreads threads will be active processing tasks. If additional tasks are submitted when all threads are active, they will wait in the queue until a thread is available.

Get more info from here.

The possible solution of your problem is to use ScheduledExecutorService.

Before that you can check Future is completed or not using

if (YOUR_FUTURE.isDone()){ result = (String) YOUR_FUTURE.get(); }

to avoid unwanted or extra loop.



来源:https://stackoverflow.com/questions/44352674/android-application-is-hanged-and-showing-black-screen-for-5-6-seconds-when-chec

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!