• Почему не прекращается Thread после закрытия приложения?

    @uzolenta Автор вопроса
    Олег,

    Возможно ли с минимальными переделками задать флаг/имя, чтобы отслеживать жив поток или нет?

    Thread {
    myfun()
    }.start()
    Написано
  • Почему не прекращается Thread после закрытия приложения?

    @uzolenta Автор вопроса
    Олег, Мне искренне интересно почитать Ваш опыт. Но вопрос остаётся открытым.
    Написано
  • Почему не прекращается Thread после закрытия приложения?

    @uzolenta Автор вопроса
    Таких чудес не знал. Спасибо.

    Всё-таки вопрос остаётся открытым.

    Thread {
    myfun()
    }.start()


    Возможно ли при такой схеме задать ему имя/флаг (и как это сделать), чтобы при открытии программы знать запущен он или нет?
    И как убить именно его из приложения по имени/флагу?
    Написано
  • Почему не прекращается Thread после закрытия приложения?

    @uzolenta Автор вопроса
    Олег, Вы комментарии набиваете? Перечитайте вопросы в посте.
    Написано
  • Почему не прекращается Thread после закрытия приложения?

    @uzolenta Автор вопроса
    Олег, Toast вызывается уже в главном потоке внутри функции. Суть в том, что приложение полностью закрыто, но функция выполняется и показываются Тосты просто на домашнем экране
    Написано
  • Как запустить цикл с okhttp3 в фоновом режиме Android?

    @uzolenta Автор вопроса
    А не может ли проблема заключаться в этом? Из файла ForegroundService

    val firstActivity = PostingVKActivity()
            val activity = ForegroundService()
            activity.setCallback(firstActivity, "9999")
  • Как запустить цикл с okhttp3 в фоновом режиме Android?

    @uzolenta Автор вопроса
    Я скинул весь код, просто убрал лишние кнопки и функции.
    Ничего лишнего не запускается и так далее.
    Действие оставил только на нажатие Button

    updateUI активируется после gEditText и что gEditText не переинициализируется позже в коде.
    Это важно, потому что lateinit свойства должны быть инициализированы до их использования.

    Проверьте по коду FirstActivity не должна повторяться, возможно gEditText обращается к ней в нескольких местах, вызывая переинициализацию, таким образом код ходит по циклу снова и снова, вызывая из другого экземпляра .

    Проверьте, что FirstActivity не пересоздается в процессе работы. Если это именно так, то создаст проблемы с инициализацией gEditText.

    Код вызова updateUI должен быть в том же потоке, в котором и был создан FirstActivity.
    обновление UI из другого потока может вызвать подобную ошибку.
  • Как запустить цикл с okhttp3 в фоновом режиме Android?

    @uzolenta Автор вопроса
    так при нажатии на Button - всё работает (gEditText.text присваивается значение)и ошибок не выдаёт.
    Сейчас она инициализируется так:

    gEditText = binding.gEditText

    Убедитесь, что binding.gEditText был успешно инициализирован в вашем Activity.
    Это обычно происходит в методе onCreate.

    (binding) и gEditText должны быть внутри представления


    Я не покидаю активити, когда обращаюсь к Service.

    Поэтому для меня и загадка, откуда такая ошибка.
  • Как запустить цикл с okhttp3 в фоновом режиме Android?

    @uzolenta Автор вопроса
    Это я тоже пробовал :) Выдаёт:
    kotlin.UninitializedPropertyAccessException: lateinit property gEditText has not been initialized


    У меня так-то сложная активити с обновлениями интерфейса и так далее - всё работает. А вот описанное в новой версии вопроса - нет
  • Как запустить цикл с okhttp3 в фоновом режиме Android?

    @uzolenta Автор вопроса
    kitcat2004, обновил вопрос, прошу посмотреть :)
  • Как запустить цикл с okhttp3 в фоновом режиме Android?

    @uzolenta Автор вопроса
    kitcat2004, val binder = service as ForegroundService.MyBinder

    Ошибка в MyBinder - что это?)
  • Как запустить цикл с okhttp3 в фоновом режиме Android?

    @uzolenta Автор вопроса
    Если делаю так, то myCallback инициализируется и данные передаются. Так правильно?
    class ForegroundService : Service() {
    
        private var myCallback: MyCallback? = null
    
        // Метод для установки объекта MyCallback
        private fun setCallback(callback: MyCallback) {
            myCallback = callback
    myCallback?.updateUI("TEST DATA")
        }
    }


    но тогда возникает проблема с инициализацией gEditText, это поле я инициализирую через Binding в onCreate
    override fun updateUI(data: String) {
            // Здесь вы обновляете ваш интерфейс, например, ваш TextView
            println("data: $data")
    
            gEditText.text = data
        }
  • Как запустить цикл с okhttp3 в фоновом режиме Android?

    @uzolenta Автор вопроса
    kitcat2004,
    Что-то не получается вызвать myCallBack
    Возможно, как-то неправильно понял куда вставлять
    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)
        }
    }


    FirstActivity
    interface MyCallback {
        fun updateUI(data: String)
    }
    classFirstActivity : AppCompatActivity(), MyCallback {
    override fun updateUI(data: String) {
            // Здесь вы обновляете ваш интерфейс, например, ваш TextView
            println("data: $data")
    
            gEditText.text = data
        }
    }
  • Как запустить цикл с okhttp3 в фоновом режиме Android?

    @uzolenta Автор вопроса
    kitcat2004, благодарю за развёрнутые ответы. Буду пробовать.
  • Как запустить цикл с okhttp3 в фоновом режиме Android?

    @uzolenta Автор вопроса
    kitcat2004, Спасибо за помощь.
    Но сейчас всё-таки более правильно юзать WorkManager или никак разница не почувствуется?

    и ещё дилетантский вопрос: код, который Вы дали, как его "поженить" с моим активити?
    class Activity : AppCompatActivity() {}

    Если без взаимодействия с интерфейсом, то понятно, просто отдельный файл под класс создать и к нему обращаться. Но Вы показали, что из Service возможно взаимодействовать с интерфейсом. Напишите подробнее, пожалуйста, как лучше.
  • Как запустить цикл с okhttp3 в фоновом режиме Android?

    @uzolenta Автор вопроса
    rPman, да я уже и лекции просмотрел и так далее, бывает такое, что просто не врубаешься, либо просто что-то не так где-то, а понять не могу.

    Выше свой год запускаю, как написал, ошибок нету, но и уведомление сам сервис не присылает, хотя там в коде есть. Т.е никаких признаков жизни от него, приложение что без него работало, что с ним.

    Сейчас ещё вопрос для понимания:

    Intent intent = new Intent(this, MyService.class);

    this - это, логично, активити откуда я запускаю. И какую я тут укажу, ту не даст закрыть Сервис Андроиду - это так работает?
  • Как запустить цикл с okhttp3 в фоновом режиме Android?

    @uzolenta Автор вопроса
    rPman, гугл и примеры там - это хорошо. Я же сюда не просто так зашёл, а на конкретно моём примере разобраться. Если зашёл, значит, сам до конца не могу допереть, как правильно использовать. Что Вы всё в гугл отправляете.
  • Как запустить цикл с okhttp3 в фоновом режиме Android?

    @uzolenta Автор вопроса
    Есть файл ForegroundService с кодом:
    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()
  • Как запустить цикл с okhttp3 в фоновом режиме Android?

    @uzolenta Автор вопроса
    rPman, а не похоже, что я не только гуглю? Варианты же кидаю, какие пробую.

    В цикле вызываю из второго варианта сервис:
    ForegroundService.startService(this, "СТАРТ ")
    Но ничего не происходит, хотя там есть
    val notification = NotificationCompat.Builder(this, CHANNEL_ID)
  • Как запустить цикл с okhttp3 в фоновом режиме Android?

    @uzolenta Автор вопроса
    Либо такой ещё есть

    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)
           // }
        }
    }