【问题标题】:How to use timer in Android如何在 Android 中使用计时器
【发布时间】:2019-05-18 13:03:47
【问题描述】:

在我的应用程序中,我有 timer 用于一些工作。
当我的应用程序在一段时间后运行时,我的应用程序 freeze 并且无法运行任何 View !
在这个计时器中,每 500msemit socket.io

我的代码:

   AsyncTask.execute(new Runnable() {
        @Override
        public void run() {
            socketPingTimer.scheduleAtFixedRate(new TimerTask() {
                @Override
                public void run() {
                    if (isSendSocketPing) {
                        checkSocketPingTimer += startSocketPingTimer;
                        if (checkSocketPingTimer == sendSocketPingTimer) {
                            currentTimerForSocket = System.currentTimeMillis();
                            try {
                                detailSocketUtils.getSendRTTforPing(currentTimerForSocket + "");
                            } catch (Exception e) {
                            }
                        }
                        //Show ping (from search)
                        Constants.currentActivity.runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                if (isShownPing) {
                                    detailToolbar_ping.setVisibility(View.VISIBLE);
                                    if (checkSocketPingTimer > 500) {
                                        detailToolbar_ping.setText(checkSocketPingTimer + "");
                                        detailToolbar_ping.setTextColor(Color.RED);

                                    } else {
                                        detailToolbar_ping.setText(checkSocketPingTimer + "");
                                        detailToolbar_ping.setTextColor(Color.GREEN);
                                    }
                                } else {
                                    detailToolbar_ping.setVisibility(View.GONE);
                                }
                            }
                        });
                        socketPing = checkSocketPingTimer;
                    }
                }
            }, 500, startSocketPingTimer);
        }
    });

如何在另一个 thread 中运行此计时器并且不冻结我的应用程序?

【问题讨论】:

  • 不要使用AsyncTask 来执行计时器。相反,请使用Handler。这是一个例子:stackoverflow.com/a/4598737/783707
  • 你可以使用CountDownTimer,它有一个tick抽象函数来实现你想要实现的任何执行,并且tick可以改变。
  • 同意 - Handler 更合适(而不是创建一个新的 Runnable 以每 500 毫秒更新一次 UI)。这里甚至还有一个更短的版本,可以帮助您摆脱 runOnUiThread 逻辑 stackoverflow.com/a/15685768/4062197
  • @AnkurAggarwal,谢谢我的朋友。你能把我上面的代码发给我吗?请亲爱的朋友
  • @ymz,谢谢我的朋友。你能把我上面的代码发给我吗?请亲爱的朋友

标签: java android android-thread


【解决方案1】:

应该和这段代码类似:

class MyActivity extends Activity
{
    private void executeLoop()
    {
        Handler myHandler = new Handler() 
        {
            public void handleMessage(Message msg) 
            {
                if (isShownPing) 
                {
                    detailToolbar_ping.setVisibility(View.VISIBLE);

                    if (checkSocketPingTimer > 500) {
                        detailToolbar_ping.setText(checkSocketPingTimer + "");
                        detailToolbar_ping.setTextColor(Color.RED);

                    } else {
                        detailToolbar_ping.setText(checkSocketPingTimer + "");
                        detailToolbar_ping.setTextColor(Color.GREEN);
                    }
                } else 
                {
                    detailToolbar_ping.setVisibility(View.GONE);
                }

            }
        }

        socketPingTimer.scheduleAtFixedRate(new TimerTask() 
        {
            @Override
            public void run() 
            {
                if (isSendSocketPing) 
                {
                    checkSocketPingTimer += startSocketPingTimer;
                    if (checkSocketPingTimer == sendSocketPingTimer) {
                        currentTimerForSocket = System.currentTimeMillis();
                        try {
                            detailSocketUtils.getSendRTTforPing(currentTimerForSocket + "");
                        } catch (Exception e) {
                        }
                    }

                    myHandler.sendEmptyMessage();

                    socketPing = checkSocketPingTimer;
                }
            }
        }, 500, startSocketPingTimer);
    }

}

【讨论】:

    【解决方案2】:

    私人无效 startTimerAtFixRate() {

        android.os.Handler handler = new android.os.Handler();
    
        Runnable updateTimerThread = new Runnable() {
            public void run() {
                //write here whatever you want to repeat
                // Like I called Log statement
                // After every 1 second this below statement will be executed
                Log.e("CALLED-->", "TRUE");
    
                handler.postDelayed(this, 1000);
            }
        };
    
        handler.postDelayed(updateTimerThread, 100);
    
      }
    

    【讨论】:

    • 我喜欢将处理程序与handler.postDelayed(this, 1000) 一起重复使用,而不仅仅是将scheduleAtFixedRate 用作循环器。你得到了我的支持:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 2012-03-20
    • 2012-10-11
    • 2011-06-03
    • 2012-05-29
    • 2012-03-26
    相关资源
    最近更新 更多