回答:
Handler().postDelayed({
//Do something after 100ms
}, 100)
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
//Do something after 100ms
}
}, 100);
removeCallbacks(Runnable r)
上Handler
。
import android.os.handler
私の場合、他の答えはどれも使用できませんでした。代わりにネイティブJavaタイマーを使用しました。
new Timer().schedule(new TimerTask() {
@Override
public void run() {
// this code will be executed after 2 seconds
}
}, 2000);
注:この回答は、質問でAndroidがコンテキストとして指定されていない場合に出されました。Android UIスレッドに固有の回答については、こちらをご覧ください。
Mac OS APIは現在のスレッドを継続させ、タスクを非同期で実行するようにスケジュールしているようです。Javaでは、同等の機能がjava.util.concurrent
パッケージによって提供されます。Androidがどのような制限を課すかわかりません。
private static final ScheduledExecutorService worker =
Executors.newSingleThreadScheduledExecutor();
void someMethod() {
⋮
Runnable task = new Runnable() {
public void run() {
/* Do something… */
}
};
worker.schedule(task, 5, TimeUnit.SECONDS);
⋮
}
ScheduledFuture<?>
返されたへの参照を格納し、worker.schedule()
そのcancel(boolean)
メソッドを呼び出すだけです。
ScheduledExecutorService
です。
5秒後にUIスレッドで何かを実行する場合:
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
@Override
public void run() {
//Do something here
}
}, 5000);
すばらしい回答をありがとう、私は自分のニーズに最適なソリューションを見つけました。
Handler myHandler = new DoSomething();
Message m = new Message();
m.obj = c;//passing a parameter here
myHandler.sendMessageDelayed(m, 1000);
class DoSomething extends Handler {
@Override
public void handleMessage(Message msg) {
MyObject o = (MyObject) msg.obj;
//do something here
}
}
Kotlin
&Java
多くの方法
Handler
Handler().postDelayed({
TODO("Do something")
}, 2000)
Timer().schedule(object : TimerTask() {
override fun run() {
TODO("Do something")
}
}, 2000)
またはもっと短い
Timer().schedule(timerTask {
TODO("Do something")
}, 2000)
または最短になります
Timer().schedule(2000) {
TODO("Do something")
}
Executors
Executors.newSingleThreadScheduledExecutor().schedule({
TODO("Do something")
}, 2, TimeUnit.SECONDS)
Javaで
Handler
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
//Do something
}
}, 2000);
Timer
new Timer().schedule(new TimerTask() {
@Override
public void run() {
// Do something
}
}, 2000);
ScheduledExecutorService
private static final ScheduledExecutorService worker = Executors.newSingleThreadScheduledExecutor();
Runnable runnable = new Runnable() {
public void run() {
// Do something
}
};
worker.schedule(runnable, 2, TimeUnit.SECONDS);
How to call a method after a delay in Android
。それで私はそれについて考えました。ポイントへ。それ以外の場合、Javaリークは、開発者が個別に理解する大きなトピックです。
このデモをご覧ください:
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?");
}
}
ハンドラーを使用する必要があるが、別のスレッドを使用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);
}
});
かなり乱雑に見えますが、これはその方法の1つです。
私はView.postDelayed()
メソッド、以下の簡単なコードを使用することを好みます:
mView.postDelayed(new Runnable() {
@Override
public void run() {
// Do something after 1000 ms
}
}, 1000);
あなたが使用している場合はAndroidのメーカー3.0をして上に、あなたは、ラムダ式を使用することができます。このメソッドcallMyMethod()
は2秒後に呼び出されます。
new Handler().postDelayed(() -> callMyMethod(), 2000);
遅延したランナブルをキャンセルする必要がある場合は、これを使用してください:
Handler handler = new Handler();
handler.postDelayed(() -> callMyMethod(), 2000);
// When you need to cancel all your posted runnables just use:
handler.removeCallbacksAndMessages(null);
Timerをお勧めします。これにより、非常に特定の間隔で呼び出されるメソッドをスケジュールできます。これはUIをブロックせず、メソッドの実行中もアプリの応答を維持します。
もう1つのオプションは、wait();です。メソッド、これは、指定された時間の間、現在のスレッドをブロックします。これにより、UIスレッドでこれを行うと、UIが応答を停止します。
これを最も簡単なソリューションに使用できます。
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
新しく導入されたラムダ式を使用して、よりクリーンにすることができます。
new Handler().postDelayed(() -> {/*your code here*/}, time);
この猫の皮をむく方法はたくさんあるので、ここで考慮すべきことがいくつかあります。答えはすべて選択され、選ばれています。「大多数が単純な答えを選択した」という理由だけで誰かが間違った方向に進むのを避けるために、これを適切なコーディングガイドラインで再検討することが重要だと思います。
それでは、最初に、このスレッドで勝者が選択した回答である単純な遅延投稿の回答について説明します。
考慮すべきいくつかのこと。ポスト遅延の後、メモリリーク、デッドオブジェクト、なくなったライフサイクルなどに遭遇する可能性があります。したがって、適切に処理することも重要です。いくつかの方法でこれを行うことができます。
現代の開発のために、KOTLINで供給します
以下は、コールバックでUIスレッドを使用し、コールバックを押したときにアクティビティがまだ正常であることを確認する簡単な例です。
Handler(Looper.getMainLooper()).postDelayed({
if(activity != null && activity?.isFinishing == false){
txtNewInfo.visibility = View.GONE
}
}, NEW_INFO_SHOW_TIMEOUT_MS)
ただし、アクティビティがなくなった場合にコールバックを実行する理由がないため、これはまだ完全ではありません。したがって、より良い方法は、それへの参照を保持し、このようなコールバックを削除することです。
private fun showFacebookStylePlus1NewsFeedOnPushReceived(){
A35Log.v(TAG, "showFacebookStylePlus1NewsFeedOnPushReceived")
if(activity != null && activity?.isFinishing == false){
txtNewInfo.visibility = View.VISIBLE
mHandler.postDelayed({
if(activity != null && activity?.isFinishing == false){
txtNewInfo.visibility = View.GONE
}
}, NEW_INFO_SHOW_TIMEOUT_MS)
}
}
そしてもちろん、コールバックをヒットしないようにonPauseでクリーンアップを処理します。
override fun onPause() {
super.onPause()
mHandler.removeCallbacks(null)
}
明白な話をしたので、今日のコルーチンとkotlinを使ったよりクリーンなオプションについて話しましょう:)。これらをまだ使用していない場合は、本当に見落としていることになります。
fun doActionAfterDelay()
launch(UI) {
delay(MS_TO_DELAY)
actionToTake()
}
}
または、そのメソッドで常にUI起動を実行する場合は、次のように簡単に実行できます。
fun doActionAfterDelay() = launch(UI){
delay(MS_TO_DELAY)
actionToTake()
}
もちろん、PostDelayedと同じように、キャンセルを確実に処理する必要があります。これにより、遅延呼び出しの後にアクティビティチェックを行うか、他のルートと同じようにonPauseでキャンセルできます。
var mDelayedJob: Job? = null
fun doActionAfterDelay()
mDelayedJob = launch(UI) {
try {
delay(MS_TO_DELAY)
actionToTake()
}catch(ex: JobCancellationException){
showFancyToast("Delayed Job canceled", true, FancyToast.ERROR, "Delayed Job canceled: ${ex.message}")
}
}
}
}
//クリーンアップを処理する
override fun onPause() {
super.onPause()
if(mDelayedJob != null && mDelayedJob!!.isActive) {
A35Log.v(mClassTag, "canceling delayed job")
mDelayedJob?.cancel() //this should throw CancelationException in coroutine, you can catch and handle appropriately
}
}
launch(UI)をメソッドシグネチャに入れると、ジョブをコードの呼び出し行に割り当てることができます。
ストーリーのモラルは、遅延したアクションで安全であること、コールバックを削除すること、またはジョブをキャンセルすることを確認してください。もちろん、遅延したコールバックの項目に触れるための適切なライフサイクルがあることを確認してください。コルーチンはキャンセル可能なアクションも提供します。
また、コルーチンで発生する可能性のあるさまざまな例外を通常処理する必要があることにも注意してください。たとえば、キャンセル、例外、タイムアウトなど、使用することにしたものは何でも。コルーチンを実際に使い始めることにした場合の、より高度な例を次に示します。
mLoadJob = launch(UI){
try {
//Applies timeout
withTimeout(4000) {
//Moves to background thread
withContext(DefaultDispatcher) {
mDeviceModelList.addArrayList(SSDBHelper.getAllDevices())
}
}
//Continues after async with context above
showFancyToast("Loading complete", true, FancyToast.SUCCESS)
}catch(ex: JobCancellationException){
showFancyToast("Save canceled", true, FancyToast.ERROR, "Save canceled: ${ex.message}")
}catch (ex: TimeoutCancellationException) {
showFancyToast("Timed out saving, please try again or press back", true, FancyToast.ERROR, "Timed out saving to database: ${ex.message}")
}catch(ex: Exception){
showFancyToast("Error saving to database, please try again or press back", true, FancyToast.ERROR, "Error saving to database: ${ex.message}")
}
}
これを呼び出す簡単なメソッドを作成しました。
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");
performSelector
。これが最善の方法です。
あなたが得るとき、1つの下で働きます、
java.lang.RuntimeException:Looper.prepare()を呼び出していないスレッド内にハンドラを作成できません
final Handler handler = new Handler(Looper.getMainLooper());
handler.postDelayed(new Runnable() {
@Override
public void run() {
//Do something after 100ms
}
}, 100);
の使用は非常に簡単CountDownTimer
です。詳細については、https://developer.android.com/reference/android/os/CountDownTimer.html
import android.os.CountDownTimer;
// calls onTick every second, finishes after 3 seconds
new CountDownTimer(3000, 1000) {
public void onTick(long millisUntilFinished) {
Log.d("log", millisUntilFinished / 1000);
}
public void onFinish() {
// called after count down is finished
}
}.start();
ハンドラーを新しくする前にハンドラーをクリーンアップすることを忘れているようです。そうでなければ、それらは潜在的に蓄積し、悪い行動を引き起こす可能性があります。
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.
次に、別のトリッキーな方法を示します。実行可能なUI要素を変更しても例外はスローされません。
public class SimpleDelayAnimation extends Animation implements Animation.AnimationListener {
Runnable callBack;
public SimpleDelayAnimation(Runnable runnable, int delayTimeMilli) {
setDuration(delayTimeMilli);
callBack = runnable;
setAnimationListener(this);
}
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
callBack.run();
}
@Override
public void onAnimationRepeat(Animation animation) {
}
}
このようなアニメーションを呼び出すことができます:
view.startAnimation(new SimpleDelayAnimation(delayRunnable, 500));
アニメーションは任意のビューにアタッチできます。
Kotlinでの怠惰な怠惰な人々の答えは次のとおりです。
Handler().postDelayed({
//doSomethingHere()
}, 1000)
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
}
}
同様のソリューションですが、使用するのによりクリーンです
この関数をクラス外に記述します
fun delay(duration: Long, `do`: () -> Unit) {
Handler().postDelayed(`do`, duration)
}
使用法:
delay(5000) {
//Do your work here
}
do
は組み込みのメソッドなので、変数名として使用するには `を使用する必要があります
do
3秒遅れてこう思いました
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()
}
}