Я пытаюсь добавить сопрограмму, которая сначала устанавливает progressBar
видимым, затем запрашивает данные у сервера, и, когда он получает данные, progressBar
устанавливается невидимым. Я читал, что для взаимодействия с пользовательским интерфейсом моя сопрограмма должна работать в Dispatcher.Main
, но когда я пытаюсь установить launch(Dispatcher.Main)
целое приложение завершается без ошибки .
Я начал следующий урок с: https://www.kotlindevelopment.com/deep-dive-coroutines/. Я изменил деталь из кода, показанного там:
launch(UI) {
progressBar.visibility = View.VISIBLE
try {
val userString = fetchUserString("1").await()
val user = deserializeUser(userString).await()
showUserData(user)
} catch (ex: Exception) {
log(ex)
} finally {
progressBar.visibility = View.GONE
}
}
до:
GlobalScope.launch(Dispatchers.Main) {
progressBarMarkers.visibility = View.VISIBLE
try {
val repository = MarkerRepository()
points = repository.getAllDataAsync().await()
}
} catch (ex: Exception) {
Log.d("EXCEPTION", ex.toString())
} finally {
progressBarMarkers.visibility = View.INVISIBLE
}
}
но это не сработало. Я начал искать, в чем может быть проблема, и обнаружил, что когда мой сопрограмма выглядит так, как показано ниже, приложение завершает работу, когда оно достигает withContext(Dispatchers.Main)
GlobalScope.launch{
val button = findViewById<ProgressBar>(R.id.progressBarMarkers)
withContext(Dispatchers.Main){
button.visibility = View.VISIBLE
}
}
Я все еще очень плохо знаком с Kotlin и сопрограммами, так что, возможно, это просто какая-то основная ошибка, но я не смог найти ответ, почему приложение закрывается и что еще завершается без ошибки
Вся сопрограмма в:
class MapsActivity : AppCompatActivity(), OnMapReadyCallback {
private lateinit var mMap: GoogleMap
private val REQUEST_PERMISSION_CODE: Int = 123
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_maps)
val mapFragment = supportFragmentManager
.findFragmentById(R.id.map) as SupportMapFragment
mapFragment.getMapAsync(this)
ShowPlacesButton.setOnClickListener {
launch{
val button = findViewById<ProgressBar>(R.id.progressBarMarkers)
withContext(Dispatchers.Main + Job()){
button.visibility = View.VISIBLE
}
}
}
}
и части моего файла Gradle:
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.google.android.gms:play-services-maps:16.1.0'
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.1"
implementation 'com.google.dagger:dagger:2.13'
kapt 'com.google.dagger:dagger-compiler:2.13'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
}
Почему приложение закрывается, когда оно достигает Dispatcher.Main
?