#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()
}
пожалуйста, скажите мне, есть ли у вас лучшее решение