pusher / pusher-websocket-java

Pusher Channels client library for Java targeting general Java and Android
Other
306 stars 144 forks source link

Android Kotlin Pusher error Start method must be called before setUserId pusher #265

Open AnD010 opened 4 years ago

AnD010 commented 4 years ago

version pusher = "2.2.1" version pusherNotifications = "1.6.2" Hi, I don´t understand this error... It only happens when I close session and call to

  PushNotifications.close()
  PushNotifications.clearAllState()

Then when go to my first Activity the app crash with the error Pusher error Start method must be called before setUserId pusher. But as you can see in my below code I call PushNotifications.start() first. When the apps crash and open again, all works fine My code
onCreate(savedInstanceState: Bundle?) {initPusher() } initPusher is this code

        GlobalScope.launch(dispatchers.main) {
            PushNotifications.start(applicationContext, "xxxxxxx-xxx-xxxxx-xx-xxxxxx")
            viewModel.loadInfoPusherSubscribe {
                val userId = it.first
                val token = it.second
                val realToken = "Bearer "+ token
                val realURL = "https://xxxxxxxxxxx?user_id=$userId"
                val tokenProvider = BeamsTokenProvider(
                    realURL,
                    object : AuthDataGetter {
                        override fun getAuthData(): AuthData {
                            return AuthData(
                                // Headers and URL query params your auth endpoint needs to
                                // request a Beams Token for a given user
                                headers = hashMapOf( Pair("Authorization", realToken),
                                                     Pair("accept", "text/plain"),
                                                     Pair("Content-Type", "application/json-patch+json")),
                                queryParams = hashMapOf()
                            )
                        }
                    }
                )

                PushNotifications.setUserId(userId, tokenProvider,
                    object : BeamsCallback<Void, PusherCallbackError> {
                        override fun onFailure(error: PusherCallbackError) {
                            Log.e("BeamsAuth", "Could not login to Beams: ${error.message}");
                        }

                        override fun onSuccess(vararg values: Void) {
                            Log.i("BeamsAuth", "Beams login success");
                        }
                    }
                )
            }
        }
My viewModel
 suspend fun loadInfoPusherSubscribe(listener: InfoPusherListener)=
       viewModelScope.launch(dispatchers.io) {
           val profileId = async { profileDao.getProfileUser().id }
           val token =  async { session.getSessionUser().accessToken }
           withContext(dispatchers.main){
               listener.invoke(Pair(profileId.await(),token.await()))

           }

    }

What is the problem? PushNotifications.start() is asynchronous method???

haidarzamzam commented 2 years ago

Halo @AnD010

I just got the same error, and I managed to solve the error by stopping everything from the pusher.

So the code to run before re-running PushNotifications.start() and setUserId() is:

PushNotifications.stop()
PushNotifications.clearAllState()

I hope this helps, maybe someone else is experiencing the same error. Thank you.

mohkoma commented 5 months ago

I think the issue is that the documentation doesn't explain well what these methods are intend for. But in short, Using stop before clearAllState doesn't do anything in reality, Just because clearAllState is just calling stop and then start (This is from source code).

fun clearAllState() {
    stop()
    start()
  }

Best way to avoid the problem is just by calling stop when the user sign out and maybe optionally call clearAllState in the start to prevent calling the methods twice.