updateUI активируется после gEditText и что gEditText не переинициализируется позже в коде.
Это важно, потому что lateinit свойства должны быть инициализированы до их использования.
Проверьте по коду FirstActivity не должна повторяться, возможно gEditText обращается к ней в нескольких местах, вызывая переинициализацию, таким образом код ходит по циклу снова и снова, вызывая из другого экземпляра .
Проверьте, что FirstActivity не пересоздается в процессе работы. Если это именно так, то создаст проблемы с инициализацией gEditText.
Код вызова updateUI должен быть в том же потоке, в котором и был создан FirstActivity.
обновление UI из другого потока может вызвать подобную ошибку.
Сейчас она инициализируется так:
gEditText = binding.gEditText
Убедитесь, что binding.gEditText был успешно инициализирован в вашем Activity.
Это обычно происходит в методе onCreate.
(binding) и gEditText должны быть внутри представления
class ForegroundService : Service() {
private var myCallback: MyCallback? = null
// Метод для установки объекта MyCallback
private fun setCallback(callback: MyCallback) {
myCallback = callback
myCallback?.updateUI("TEST DATA")
}
}
override fun updateUI(data: String) {
// Здесь вы обновляете ваш интерфейс, например, ваш TextView
println("data: $data")
gEditText.text = data
}
val firstActivity = FirstActivity()
val activity = Activity()
// Свяжите Activity и FirstActivity
activity.setCallback(firstActivity)
class ForegroundService : Service() {
private var myCallback: MyCallback? = null
// Метод для установки объекта MyCallback
private fun setCallback(callback: MyCallback) {
myCallback = callback
}
private val CHANNEL_ID = "1"
companion object {
fun startService(context: Context, message: String) {
val startIntent = Intent(context, ForegroundService::class.java)
startIntent.putExtra("inputExtra", message)
ContextCompat.startForegroundService(context, startIntent)
}
fun stopService(context: Context) {
val stopIntent = Intent(context, ForegroundService::class.java)
context.stopService(stopIntent)
}
}
@RequiresApi(Build.VERSION_CODES.O)
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
//do heavy work on a background thread
val input = intent?.getStringExtra("inputExtra")
createNotificationChannel()
val notificationIntent = Intent(this, PostingVKActivity::class.java)
val pendingIntent = PendingIntent.getActivity(
this,
0, notificationIntent, PendingIntent.FLAG_IMMUTABLE
)
val notification = NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("Foreground Service Kotlin Example")
.setContentText(input)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentIntent(pendingIntent)
.build()
val firstActivity = FirstActivity()
val activity = ForegroundService()
activity.setCallback(firstActivity)
myCallback?.updateUI("TEST DATA")
startForeground(2, notification)
return START_NOT_STICKY
}
override fun onBind(intent: Intent): IBinder? {
return null
}
@RequiresApi(Build.VERSION_CODES.O)
private fun createNotificationChannel() {
val serviceChannel = NotificationChannel(CHANNEL_ID, "2",
NotificationManager.IMPORTANCE_DEFAULT)
val manager = getSystemService(NotificationManager::class.java)
manager!!.createNotificationChannel(serviceChannel)
}
}
interface MyCallback {
fun updateUI(data: String)
}
classFirstActivity : AppCompatActivity(), MyCallback {
override fun updateUI(data: String) {
// Здесь вы обновляете ваш интерфейс, например, ваш TextView
println("data: $data")
gEditText.text = data
}
}
class Activity : AppCompatActivity() {}
Intent intent = new Intent(this, MyService.class);
class ForegroundService : Service() {
private val CHANNEL_ID = "1"
companion object {
fun startService(context: Context, message: String) {
val startIntent = Intent(context, ForegroundService::class.java)
startIntent.putExtra("inputExtra", message)
ContextCompat.startForegroundService(context, startIntent)
}
fun stopService(context: Context) {
val stopIntent = Intent(context, ForegroundService::class.java)
context.stopService(stopIntent)
}
}
@RequiresApi(Build.VERSION_CODES.O)
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
//do heavy work on a background thread
val input = intent?.getStringExtra("inputExtra")
createNotificationChannel()
val notificationIntent = Intent(this, PostingVKActivity::class.java)
val pendingIntent = PendingIntent.getActivity(
this,
0, notificationIntent, PendingIntent.FLAG_IMMUTABLE
)
val notification = NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("Foreground Service Kotlin Example")
.setContentText(input)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentIntent(pendingIntent)
.build()
startForeground(1, notification)
//stopSelf();
return START_NOT_STICKY
}
override fun onBind(intent: Intent): IBinder? {
return null
}
@RequiresApi(Build.VERSION_CODES.O)
private fun createNotificationChannel() {
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val serviceChannel = NotificationChannel(CHANNEL_ID, "1",
NotificationManager.IMPORTANCE_DEFAULT)
val manager = getSystemService(NotificationManager::class.java)
manager!!.createNotificationChannel(serviceChannel)
// }
}
}
fun HOPO(){
g = 0
while(g < 10){
api = "https://test.ru/g=$g"
val request = Request.Builder()
.url(api)
.post(postBody.toRequestBody(MEDIA_TYPE_MARKDOWN))
.header("X-Get-Processing-Time", "1")
.removeHeader("User-Agent")
.addHeader("User-Agent", UserAgent)
.build()
client.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
e.printStackTrace()
}
override fun onResponse(call: Call, response: Response) {
runOnUiThread {
gEditText.text = "$g"
}
}
})
g++
}//END WHILE
}//END FUN
val intentActivity = Intent(this, Activity::class.java)
startService(intentActivity)
HOPO()
class ForegroundService : Service() {
private val CHANNEL_ID = "1"
companion object {
fun startService(context: Context, message: String) {
val startIntent = Intent(context, ForegroundService::class.java)
startIntent.putExtra("inputExtra", message)
ContextCompat.startForegroundService(context, startIntent)
}
fun stopService(context: Context) {
val stopIntent = Intent(context, ForegroundService::class.java)
context.stopService(stopIntent)
}
}
@RequiresApi(Build.VERSION_CODES.O)
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
//do heavy work on a background thread
val input = intent?.getStringExtra("inputExtra")
createNotificationChannel()
val notificationIntent = Intent(this, PostingVKActivity::class.java)
val pendingIntent = PendingIntent.getActivity(
this,
0, notificationIntent, PendingIntent.FLAG_IMMUTABLE
)
/*
val notification = NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("Foreground Service Kotlin Example")
.setContentText(input)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentIntent(pendingIntent)
.build()
startForeground(1, notification)
*/
//stopSelf();
return START_NOT_STICKY
}
override fun onBind(intent: Intent): IBinder? {
return null
}
@RequiresApi(Build.VERSION_CODES.O)
private fun createNotificationChannel() {
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val serviceChannel = NotificationChannel(CHANNEL_ID, "1",
NotificationManager.IMPORTANCE_DEFAULT)
val manager = getSystemService(NotificationManager::class.java)
manager!!.createNotificationChannel(serviceChannel)
// }
}
}
Возможно ли с минимальными переделками задать флаг/имя, чтобы отслеживать жив поток или нет?