Как вызвать метод после задержки в Android
Я хочу иметь возможность вызывать следующий метод после указанной задержки. В цели c было что-то вроде:
[self performSelector:@selector(DoSomething) withObject:nil afterDelay:5];
Есть ли эквивалент этого метода в Android с Java? Например, мне нужно иметь возможность вызывать метод через 5 секунд.
public void DoSomething()
{
//do something here
}
36 ответов
Другой ответ (java8) по классу активности.
//hide with delay
new Thread(() -> {
try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}
this.runOnUiThread(() -> {
myView.setVisibility(View.GONE);//this run on GUI
});
}).start();
В Android ниже можно написать код kotlin для задержки выполнения любой функции.
class MainActivity : AppCompatActivity() {
private lateinit var handler: Handler
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
handler= Handler()
handler.postDelayed({
doSomething()
},2000)
}
private fun doSomething() {
Toast.makeText(this,"Hi! I am Toast Message",Toast.LENGTH_SHORT).show()
}
}
Аналогичное решение, но гораздо более чистое в использовании
Напишите эту функцию вне класса
fun delay(duration: Long, `do`: () -> Unit) {
Handler().postDelayed(`do`, duration)
}
Использование:
delay(5000) {
//Do your work here
}
Есть много способов сделать это, но лучше всего использовать обработчик, как показано ниже
long millisecDelay=3000
Handler().postDelayed({
// do your work here
},millisecDelay)
Подходящее решение в Android:
private static long SLEEP_TIME = 2 // for 2 second
.
.
MyLauncher launcher = new MyLauncher();
launcher.start();
.
.
private class MyLauncher extends Thread {
@Override
/**
* Sleep for 2 seconds as you can also change SLEEP_TIME 2 to any.
*/
public void run() {
try {
// Sleeping
Thread.sleep(SLEEP_TIME * 1000);
} catch (Exception e) {
Log.e(TAG, e.getMessage());
}
//do something you want to do
//And your code will be executed after 2 second
}
}
Что ж, вы всегда можете использовать наследие
Thread.sleep()
если вы используете Java.
new Thread(() -> {
try {
Thread.sleep(millis); //delay in milliseconds
} catch (Exception e) {
e.printStackTrace();
}
yourMethod();
}).start();
Единственная проблема здесь в том, что вы не можете делать никаких обновлений пользовательского интерфейса, поскольку это отдельный поток.