не могу использовать обработчик для запуска фрагмента с задержкой

#java #android #android-studio #kotlin #splash-screen

Вопрос:

Я хочу установить SplashScreen(фрагмент) в своем приложении, и, поскольку это приложение для онлайн-покупок, я должен проверить наличие подключения к Интернету.
В этом приложении у меня есть 4 основных фрагмента и одно основное действие. Я использовал индикатор выполнения ,текстовое представление и кнопку обновления во фрагменте заставки. давайте посмотрим часть кода!…

 val networkConnection = NetworkConnection(requireContext())
    networkConnection.observe(requireActivity()) { isConnected ->
        if (isConnected) {
            binding.refresh.setOnClickListener {

                binding.apply {
                    progress.visibility = View.VISIBLE
                    progress.animate().start()
                    connectivityText.visibility = View.INVISIBLE
                    refresh.visibility = View.INVISIBLE
                    go()
                }

            }
        } else {
            binding.apply {
                progress.visibility = View.GONE
                connectivityText.visibility = View.VISIBLE
                refresh.visibility = View.VISIBLE
            }

        }
    }
 

эта часть предназначена для случаев, когда я не подключен к Интернету и запускаю приложение.
появится текстовое представление с текстом «вы не подключены к Интернету», и появится кнопка обновить, чтобы обновить фрагмент после подключения. Это прекрасно работает.
проблема в том, что я подключаюсь к Интернету и запускаю приложение. Давайте посмотрим код.

 val s = S(requireContext())
    when (s.isOnline()) {
        true -> {
            binding.apply {
                progress.visibility = android.view.View.VISIBLE
                progress.animate().start()
                connectivityText.visibility = android.view.View.INVISIBLE
                refresh.visibility = android.view.View.INVISIBLE
               
            }

        }
        false -> {
            binding.apply {
                progress.visibility = View.GONE
                connectivityText.visibility = View.VISIBLE
                refresh.visibility = View.VISIBLE
            }
        }
    }  
 

«S» — это файл, который имеет функцию IsOnline (). я хочу использовать приведенный ниже код в заявлении «if(IsOnline)»

  Handler(Looper.getMainLooper()).postDelayed({
        val action =
            SplashFragmentDirections.actionSplashFragmentToHomeFragment2()
        findNavController().navigate(action)
        CoroutineScope(Dispatchers.Main).launch {
            delay(4)
           
        }
    }, 4000)    
 

когда я задаю этот код в операторе «if(isonline)», я вижу эту ошибку:
не удалось подключиться к /192.168.1.36 (порт 80) из /:: (порт 0), и когда я удаляю его оттуда
, приложение работает нормально без ошибок .

Класс сетевых соединений:

 class NetworkConnection( private val context: Context) : LiveData<Boolean>() {
private var connectivityManager: ConnectivityManager =
    context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager


private lateinit var networkCallback: ConnectivityManager.NetworkCallback

override fun onActive() {
    super.onActive()
    updateConnection()
    when {
        Build.VERSION.SDK_INT >= Build.VERSION_CODES.N -> {
            connectivityManager.registerDefaultNetworkCallback(ConnectivityManagerCallback())
        }
        Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP -> {
            lollipopNetworkRequest()
        }
        else -> {
            context.registerReceiver(
                networkReciever,
                IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)
            )
        }
    }
}

@RequiresApi(Build.VERSION_CODES.N)
override fun onInactive() {
    super.onInactive()
}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private fun lollipopNetworkRequest() {
    val requestBuilder = NetworkRequest.Builder()
        .addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET)
        .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
    connectivityManager.registerNetworkCallback(
        requestBuilder.build(),
        ConnectivityManagerCallback()
    )
}

private fun ConnectivityManagerCallback(): ConnectivityManager.NetworkCallback {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        networkCallback = object : ConnectivityManager.NetworkCallback() {
            override fun onLost(network: Network) {

                super.onLost(network)

                postValue(false)
            }


            override fun onAvailable(network: Network) {

                super.onAvailable(network)

                postValue(true)
            }
        }
    } else {
        throw IllegalAccessError("ERROR")
    }
    return networkCallback
}

private var networkReciever = object : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        updateConnection()
    }
}

private fun updateConnection() {
    val activeNetwork: NetworkInfo? = connectivityManager.activeNetworkInfo
    if (activeNetwork?.isConnected == true) {
        postValue(true)
    } else {
        postValue(false)
    }
  }
}
 

Это заняло у меня неделю, и до сих пор я понятия не имею . помогите мне, пожалуйста
любая помощь будет оценена по достоинству.

Ответ №1:

Я изменил свой фрагмент заставки на действие, а также удалил его из графика, а затем использовал поток вместо такого обработчика для той части, где он был подключен к Интернету

 var ms: Long = 0
val splashTime = 2000
val splashActive = true
val paused = false  

//use go() method here instead of this thread.check below to see go() method
Thread {

        try {
            while (splashActive amp;amp; ms < splashTime) {
                if (!paused)
                    ms  = 100

                Thread.sleep(100)
            }
        } catch (e: Exception) {
            e.fillInStackTrace()
        } finally {
            if (!s.isOnline()) {

            } else {
                startActivity(Intent(this, MainActivity::class.java))
            }
        }
    }.start()
 

Я изменил ту часть, где я не был подключен к Интернету, как это:

 val networkConnection = NetworkConnection(this)
    networkConnection.observe(this) { isConnected ->
        if (isConnected) {
            binding.refresh.setOnClickListener {
                binding.apply {
                    progress.visibility = View.VISIBLE
                    progress.animate().start()
                    connectivityText.visibility = View.INVISIBLE
                    refresh.visibility = View.INVISIBLE
                }
            //use go() method here instead of this thread.check below to see go() method
                Thread {
                    Thread.sleep(2000)
                    startActivity(Intent(this, MainActivity::class.java))
                }.start()
            }
        } else {
            binding.apply {
                progress.visibility = View.GONE
                connectivityText.visibility = View.VISIBLE
                refresh.visibility = View.VISIBLE
            }

        }
    }
 

Обновить

поместите код первой части, где я был подключен к Интернету, в один метод, а затем используйте этот метод в любом месте, где вы хотите, вот так:

  fun go() {
    val s = S(this)
    Thread {

        try {
            while (splashActive amp;amp; ms < splashTime) {
                if (!paused)
                    ms  = 100

                Thread.sleep(100)
            }
        } catch (e: Exception) {
            e.fillInStackTrace()
        } finally {
            if (!s.isOnline()) {

            } else {
                startActivity(Intent(this, MainActivity::class.java))
            }
        }
    }.start()
}
 

пожалуйста, скажите мне, есть ли у вас лучшее решение