web-dev-qa-db-ja.com

Androidで5秒後に関数を実行する

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");
    }

}
27
Jishad

ハンドラーを使用して遅延を追加できます。メソッドdisplayData()を以下のように呼び出して、5秒後に実行されるようにします。

_new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
          displayData();
        }
    }, 5000);
_

注:Thread.sleep(5000);のようなスレッドを使用しないでください。UIがブロックされ、応答しなくなるためです。

77
Kartheek

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);
  }
});
4
mushahid

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();
4
Fantômas

これを試して、1つのティックでCountDownTimerを作成するコード

timer = new CountDownTimer(5000, 5000)
{
    public void onTick(long millisUntilFinished)
    {
    }

    public void onFinish()
    {
        displayData();
    }
};
timer.start();
3
bongo
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);
2
fazeel zama

これを達成するための最良のオプションは、 Handler を使用することです。

 int TIME = 5000; //5000 ms (5 Seconds)

        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {

               function(); //call function!

            }
        }, TIME);
1
Jorgesys

可能な場合は、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)
0
franzesz