Что пошло не так
Использование Thread.sleep(...)
Thread.sleep заставляет текущий поток приостанавливать выполнение на указанный период. Это эффективное средство предоставления процессорного времени доступным другим потокам приложения или другим приложениям, которые могут работать в компьютерной системе.
Для разъяснения OP (Оригинальный постер / Аскер):
Он замораживает интерфейс, кто-нибудь знает, почему это происходит?
Как упоминалось выше из официальной документации Java, вы испытываете некоторое зависание в пользовательском интерфейсе, потому что вы вызвали его в Main Thread .
Основной поток или, если вы делаете свои вещи в Android, его часто называют Пользовательский интерфейс :
На платформе Android приложения по умолчанию работают в одном потоке. Этот поток называется потоком UI . Это часто называют так, потому что этот единственный поток отображает пользовательский интерфейс и прослушивает события, которые происходят, когда пользователь взаимодействует с приложением.
Без использования многопоточных API (таких как Runnable
, Coroutines
, RxJava
) вы автоматически будете вызывать Thread.sleep(1000)
в потоке пользовательского интерфейса , поэтому вы вы испытываете "UI Freezing" опыт, потому что другие UI Operations
заблокированы от доступа к потоку, так как вы вызвали приостановку на нем.
А как отложить без зависания интерфейса?
Используйте всю мощь доступных API для многопоточности, поэтому лучше начать со следующих опций:
1. Runnable
В Java
// Import
import android.os.Handler;
// Use
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
// do something after 1000ms
}
}, 1000);
В Котлине
// Import
import android.os.Handler;
// Use
val handler = Handler()
handler.postDelayed({
// do something after 1000ms
}, 1000)
2. Котлин сопрограммы
// Import
import java.util.*
import kotlin.concurrent.schedule
// Use
Timer().schedule(1000){
// do something after 1 second
}
3. RxJava
// Import
import io.reactivex.Completable
import java.util.concurrent.TimeUnit
// Use
Completable
.timer(1, TimeUnit.SECONDS)
.subscribeOn(Schedulers.io()) // where the work should be done
.observeOn(AndroidSchedulers.mainThread()) // where the data stream should be delivered
.subscribe({
// do something after 1 second
}, {
// do something on error
})
В настоящее время RxJava является одним из трех способов многопоточности и обработки огромного количества потоков данных в вашем приложении. Но если вы только начинаете, хорошо бы сначала опробовать основы.
Ссылки