Выполнить функцию через 5 секунд в Android
Я новичок в разработке Android, и теперь моя активность запуска проявляется всего 5 секунд, после чего я хочу проверить, что пользователь вошел в систему или не выполнил действия.
вот мой код.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
exactPreferences = getSharedPreferences("ExactPreference",MODE_PRIVATE);
setContentView(R.layout.activity_landing_page);
session = exactPreferences.getString(Model.getSingleton().SHARED_SESSION_ID,null);
Log.i("Session Id",session);
displayData(); // I want to perform this function after 5 seconds.
}
private void displayData() {
if(session.equals("")){
Intent loginIntent = new Intent(LandingPage.this,
LoginActivity.class);
startActivity(loginIntent);
Log.i("User Logged In", "False");
}
else
{
Intent objIntent = new Intent(LandingPage.this,
IndexPageActivity.class);
startActivity(objIntent);
Log.i("User Logged In", "True");
}
}
Ответы
Ответ 1
Вы можете использовать Handler для добавления некоторой задержки. Выполните метод displayData()
, как показано ниже, чтобы он выполнялся через 5 секунд.
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
displayData();
}
}, 5000);
Примечание. Не используйте потоки, такие как Thread.sleep(5000);
, потому что он заблокирует ваш пользовательский интерфейс и сделает его безответным.
Ответ 2
Назначьте переменную millisDelayTime с миллисекундами, которые вы хотите вызвать задержка. mActivity является объектом Activity для обеспечения контекста приложения. В вашем случае millisDelayTime должно быть инициализировано с 5000
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
//your code here
}
}, millisDelayTime);
}
});
Ответ 3
Использовать CountDownTimer
// There a TextView txtCount in Main Activity
final int secs = 5;
new CountDownTimer((secs +1) * 1000, 1000) // Wait 5 secs, tick every 1 sec
{
@Override
public final void onTick(final long millisUntilFinished)
{
txtCount.setText("" + (int) (millisUntilFinished * .001f));
}
@Override
public final void onFinish()
{
txtCount.setText("GO!");
finish();
// Time up - Start the Login Activity
final Intent tnt =
new Intent(getApplicationContext(), LoginActivity.class);
startActivity(tnt);
}
}.start();
Ответ 4
Попробуйте это, создайте CountDownTimer с одним тиком
timer = new CountDownTimer(5000, 5000)
{
public void onTick(long millisUntilFinished)
{
}
public void onFinish()
{
displayData();
}
};
timer.start();
Ответ 5
Лучшим вариантом для этого является использование Обработчик:
int TIME = 5000; //5000 ms (5 Seconds)
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
function(); //call function!
}
}, TIME);
Ответ 6
long delay = 1000;
long period = 50000;
Timer task = new Timer();
task.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
getDriver(sessionManager.getKEY(), ride_id);
}
}, delay, period);
Ответ 7
По возможности старайтесь избегать использования postDelayed. Это плохая практика, поскольку она может потерять ссылку на объекты, которые вы хотите нарисовать на экране, и вызвать NPE. Вместо этого используйте обработчик. Прежде всего, создайте глобальную переменную Handler, в которой вам придется "обрабатывать" логику для вашего кода. Сделайте это, используя функцию handleMessage.
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
if(msg.what == 1){
// your code here
}
}
};
Затем, где бы вы его не захотели, просто вызовите функцию:
// 1 is the ID of your process
handler.sendEmptyMessageDelayed(1, 5000);
Помните, что в методе onDestroyView (в фрагменте) или onDestroy (в действии) вам нужно будет позвонить
handler.removeMessages(1)