在 Android 5 秒后执行函数
Execute function after 5 seconds in Android
我是 android 开发新手,现在我的启动器 activity 只显示 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");
}
}
您可以使用 Handler 添加一些 delay.Call 方法 displayData()
如下所示,这样它将在 5 秒后执行。
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
displayData();
}
}, 5000);
注意:不要使用像Thread.sleep(5000);
这样的线程,因为它会阻塞你的UI并使其无响应。
使用 CountDownTimer
// There's 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's up - Start the Login Activity
final Intent tnt =
new Intent(getApplicationContext(), LoginActivity.class);
startActivity(tnt);
}
}.start();
试试这个,代码用一个刻度创建 CountDownTimer
timer = new CountDownTimer(5000, 5000)
{
public void onTick(long millisUntilFinished)
{
}
public void onFinish()
{
displayData();
}
};
timer.start();
为 millisDelayTime 变量分配您希望造成延迟的毫秒数。 mActivity是Activity的对象,用于提供Application Context。在你的情况下 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);
}
});
实现此目的的最佳选择是使用 Handler:
int TIME = 5000; //5000 ms (5 Seconds)
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
function(); //call function!
}
}, TIME);
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);
尽可能避免使用postDelayed。这是一种不好的做法,因为它可能会丢失对要在屏幕上绘制的对象的引用并导致 NPE。请改用处理程序。首先,创建一个全局变量 Handler,您必须在其中 "handle" 代码逻辑。通过使用函数 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 方法(在 Fragment 中)或 onDestroy(在 Activity 中)你必须调用
handler.removeMessages(1)
对于 kotlin 方式
Handler().postDelayed({
//do something
}, 5000)
因为 Handler 现已弃用,所以请使用此代码:
new Handler(Looper.myLooper()).postDelayed(new Runnable() {
@Override
public void run() {
//do what you want
}
}, 5000);
我是 android 开发新手,现在我的启动器 activity 只显示 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");
}
}
您可以使用 Handler 添加一些 delay.Call 方法 displayData()
如下所示,这样它将在 5 秒后执行。
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
displayData();
}
}, 5000);
注意:不要使用像Thread.sleep(5000);
这样的线程,因为它会阻塞你的UI并使其无响应。
使用 CountDownTimer
// There's 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's up - Start the Login Activity
final Intent tnt =
new Intent(getApplicationContext(), LoginActivity.class);
startActivity(tnt);
}
}.start();
试试这个,代码用一个刻度创建 CountDownTimer
timer = new CountDownTimer(5000, 5000)
{
public void onTick(long millisUntilFinished)
{
}
public void onFinish()
{
displayData();
}
};
timer.start();
为 millisDelayTime 变量分配您希望造成延迟的毫秒数。 mActivity是Activity的对象,用于提供Application Context。在你的情况下 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);
}
});
实现此目的的最佳选择是使用 Handler:
int TIME = 5000; //5000 ms (5 Seconds)
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
function(); //call function!
}
}, TIME);
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);
尽可能避免使用postDelayed。这是一种不好的做法,因为它可能会丢失对要在屏幕上绘制的对象的引用并导致 NPE。请改用处理程序。首先,创建一个全局变量 Handler,您必须在其中 "handle" 代码逻辑。通过使用函数 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 方法(在 Fragment 中)或 onDestroy(在 Activity 中)你必须调用
handler.removeMessages(1)
对于 kotlin 方式
Handler().postDelayed({
//do something
}, 5000)
因为 Handler 现已弃用,所以请使用此代码:
new Handler(Looper.myLooper()).postDelayed(new Runnable() {
@Override
public void run() {
//do what you want
}
}, 5000);