ConnectSDK / Connect-SDK-Android

Android source project for Connect SDK
Apache License 2.0
304 stars 129 forks source link

java.net.SocketException: Socket closed Android 9.0 #377

Open bharathnr21 opened 5 years ago

bharathnr21 commented 5 years ago

When we call DiscoveryManager.start() app crashing.

viet97 commented 4 years ago

did u solve the problem ? may be i can help

baitsaikiransudhir commented 3 years ago

Did you called DiscoveryManager.init(applicationContext) before start?

BhargavBhanshali commented 3 years ago

did u solve the problem ? may be i can help

pl help.

viet97 commented 3 years ago

did u solve the problem ? may be i can help

pl help.

its was long time ago, whats ur issue now ?

BhargavBhanshali commented 3 years ago

did u solve the problem ? may be i can help

pl help.

its was long time ago, whats ur issue now ?

when i turn off wifi while Discoverymanager is started, my app is hanged and shows ANR dialog after few seconds..

what to do?

songcamhoi commented 3 years ago

Hello, currently our company is in need of acquiring the source code of the android tv remote application or outsourcing the android developer who used to make that application. Please don't worry about the budget, if caring please contact: nguyenthiduong11a@gmail.com or skype: live: 5fbc1be22b9ce0f4

its was long time ago, whats ur issue now ?

waqasyousafy commented 3 years ago

anyone here for help I am facing the same problem I have solved my problem by adding this line mDiscoveryManager.registerDefaultDeviceTypes();

muqeeta96 commented 1 year ago

If you go inside DiscoveryManager.getInstance().start() method. We find that it forces code inside the start() method to run on UI Thread which causes ANR when the internet goes off or you use an app for sometime.

Inside DiscoveryManager.getInstance().start() Method

  public void start() {
    if (mSearching)
        return;

    if (discoveryProviders == null) {
        return;
    }

    mSearching = true;
    multicastLock.acquire();

    Util.runOnUI(new Runnable() {

        @Override
        public void run() {

    if (discoveryProviders.size() == 0) {
        registerDefaultDeviceTypes();
    }

    ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

    if (mWifi.isConnected()) {
        for (DiscoveryProvider provider : discoveryProviders) {
            provider.start();
        }
    } else {
        Log.w(Util.T, "Wifi is not connected yet");

        Util.runOnUI(new Runnable() {

            @Override
            public void run() {
                for (DiscoveryManagerListener listener : discoveryListeners)
                    listener.onDiscoveryFailed(DiscoveryManager.this, new ServiceCommandError(0, "No wifi connection", null));
            }
        });
    }

        }
    });
}

I clone the connect-sdk project and remove lines inside DiscoveryManager.getInstance().start() method.

My Changes Look Like This

   public void start() {
    if (mSearching)
        return;

    if (discoveryProviders == null) {
        return;
    }

    mSearching = true;
    multicastLock.acquire();

    if (discoveryProviders.size() == 0) {
        registerDefaultDeviceTypes();
    }

    ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

    if (mWifi.isConnected()) {
        for (DiscoveryProvider provider : discoveryProviders) {
            provider.start();
        }
    } else {
        Log.w(Util.T, "Wifi is not connected yet");

        Util.runOnUI(new Runnable() {

            @Override
            public void run() {
                for (DiscoveryManagerListener listener : discoveryListeners)
                    listener.onDiscoveryFailed(DiscoveryManager.this, new ServiceCommandError(0, "No wifi connection", null));
            }
        });
    }

}

Simply call DiscoveryManager.getInstance().start() from background thread. Now, code inside start() will run in a background thread. Something like that in Kotlin

    CoroutineScope(Dispatchers.IO).launch {
            DiscoveryManager.getInstance().start()
    }
sougoukk commented 5 months ago

If you go inside DiscoveryManager.getInstance().start() method. We find that it forces code inside the start() method to run on UI Thread which causes ANR when the internet goes off or you use an app for sometime.

Inside DiscoveryManager.getInstance().start() Method

  public void start() {
    if (mSearching)
        return;

    if (discoveryProviders == null) {
        return;
    }

    mSearching = true;
    multicastLock.acquire();

    Util.runOnUI(new Runnable() {

        @Override
        public void run() {

    if (discoveryProviders.size() == 0) {
        registerDefaultDeviceTypes();
    }

    ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

    if (mWifi.isConnected()) {
        for (DiscoveryProvider provider : discoveryProviders) {
            provider.start();
        }
    } else {
        Log.w(Util.T, "Wifi is not connected yet");

        Util.runOnUI(new Runnable() {

            @Override
            public void run() {
                for (DiscoveryManagerListener listener : discoveryListeners)
                    listener.onDiscoveryFailed(DiscoveryManager.this, new ServiceCommandError(0, "No wifi connection", null));
            }
        });
    }

        }
    });
}

I clone the connect-sdk project and remove lines inside DiscoveryManager.getInstance().start() method.

My Changes Look Like This

   public void start() {
    if (mSearching)
        return;

    if (discoveryProviders == null) {
        return;
    }

    mSearching = true;
    multicastLock.acquire();

    if (discoveryProviders.size() == 0) {
        registerDefaultDeviceTypes();
    }

    ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

    if (mWifi.isConnected()) {
        for (DiscoveryProvider provider : discoveryProviders) {
            provider.start();
        }
    } else {
        Log.w(Util.T, "Wifi is not connected yet");

        Util.runOnUI(new Runnable() {

            @Override
            public void run() {
                for (DiscoveryManagerListener listener : discoveryListeners)
                    listener.onDiscoveryFailed(DiscoveryManager.this, new ServiceCommandError(0, "No wifi connection", null));
            }
        });
    }

}

Simply call DiscoveryManager.getInstance().start() from background thread. Now, code inside start() will run in a background thread. Something like that in Kotlin

    CoroutineScope(Dispatchers.IO).launch {
            DiscoveryManager.getInstance().start()
    }

This won't work