java - studio定時 - runnable android delay




如何在Android中延遲後調用方法 (14)

我希望能夠在指定的延遲後調用以下方法。 在目標c中有這樣的東西:

[self performSelector:@selector(DoSomething) withObject:nil afterDelay:5];

有沒有這種方法在Android與Java的等價物? 例如,我需要能夠在5秒後調用方法。

public void DoSomething()
{
     //do something here
}

5秒後在UI線程中執行某些操作:

new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
    @Override
    public void run() {
        //Do something here
    }
}, 5000);

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
        }
    }

你可以在UIThread中使用Handler:

runOnUiThread(new Runnable() {

    @Override
    public void run() {
         final Handler handler = new Handler();
         handler.postDelayed(new Runnable() {
           @Override
           public void run() {
               //add your code here
           }
         }, 1000);

    }
});

你可以通過使用新引入的lambda表達式使它更加清潔:

        new Handler().postDelayed(() -> {/*your code here*/}, time);

在我的情況下,我無法使用任何其他答案。 我使用了原生的java Timer。

new Timer().schedule(new TimerTask() {          
    @Override
    public void run() {
        // this code will be executed after 2 seconds       
    }
}, 2000);

在發布新的可運行或消息之前,每個人似乎都忘記清理Handler。 其他途徑他們可能會積累並導致不良行為。

handler.removeMessages(int what);
// Remove any pending posts of messages with code 'what' that are in the message queue.

handler.removeCallbacks(Runnable r)
// Remove any pending posts of Runnable r that are in the message queue.

如果您必須使用處理程序,但您進入另一個線程,則可以使用runonuithread在UI線程中運行處理程序。 這將節省您從拋出的異常中請求調用Looper.Prepare()

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                //Do something after 1 second
            }
        }, 1000);
    }
});

看起來相當混亂,但這是其中之一。


您可以將其用於最簡單的解決方案:

new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        //Write your code here
    }
}, 5000); //Timer is in ms here.

否則,下面可能是另一個乾淨有用的解決方案:

new Handler().postDelayed(() -> 
{/*Do something here*/}, 
5000); //time in ms

我創建了更簡單的方法來調用它。

public static void CallWithDelay(long miliseconds, final Activity activity, final String methodName)
    {
        new Handler().postDelayed(new Runnable() {

            @Override
            public void run() {
                try {
                    Method method =  activity.getClass().getMethod(methodName);
                    method.invoke(activity);
                } catch (NoSuchMethodException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }, miliseconds);
    }

要使用它,只需調用: .CallWithDelay(5000, this, "DoSomething");


我建議Timer ,它允許你安排一個方法在一個非常特定的時間間隔被調用。 這不會阻止您的用戶界面,並且在執行該方法時保持您的應用程序的響應。

另一個選項是wait(); 方法,這將阻塞當前線程達指定的時間長度。 這將導致你的用戶界面停止響應,如果你在UI線程上這樣做。


更好的版本:

final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
  @Override
  public void run() {
    //Do something after 100ms
  }
}, 100);

看到這個演示:

import java.util.Timer;
import java.util.TimerTask;

class Test {
     public static void main( String [] args ) {
          int delay = 5000;// in ms 

          Timer timer = new Timer();

          timer.schedule( new TimerTask(){
             public void run() { 
                 System.out.println("Wait, what..:");
              }
           }, delay);

           System.out.println("Would it run?");
     }
}

這是我最短的解決方案:

new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        //Do something after 100ms
    }
}, 100);

final Handler handler = new Handler(); 
Timer t = new Timer(); 
t.schedule(new TimerTask() { 
    public void run() { 
        handler.post(new Runnable() { 
            public void run() { 
                //DO SOME ACTIONS HERE , THIS ACTIONS WILL WILL EXECUTE AFTER 5 SECONDS...
            }
        }); 
    } 
}, 5000); 






delay