【问题标题】:What is the equivalent of setTimeOut() javascript to Android?什么是 setTimeOut() javascript 到 Android 的等价物?
【发布时间】:2012-02-05 00:23:39
【问题描述】:

我需要setTimeOut(call function(),milliseconds); for android 的等效代码。

setTimeOut(call function(),milliseconds);

【问题讨论】:

标签: java javascript android equivalent


【解决方案1】:

您可能想查看TimerTask

既然你再次提出这个问题,我想提出一个不同的建议,那就是Handler。它比 TimerTask 使用起来更简单,因为您不需要显式调用 runOnUiThread,因为只要它是在 UI 线程上创建的,或者您使用其构造函数中的主循环器创建它,处理程序就会与 UI 线程相关联。它会像这样工作:

private Handler mHandler;
Runnable myTask = new Runnable() {
  @Override
  public void run() {
     //do work
     mHandler.postDelayed(this, 1000);
  }
}

@Override
public void onCreate(Bundle savedState) {
  super.onCreate(savedState);
  mHandler = new Handler(Looper.getMainLooper());
}
//just as an example, we'll start the task when the activity is started
@Override
public void onStart() { 
  super.onStart();
  mHandler.postDelayed(myTask, 1000);
}

//at some point in your program you will probably want the handler to stop (in onStop is a good place)
@Override
public void onStop() {
  super.onStop();
  mHandler.removeCallbacks(myTask);
}

在您的活动中使用处理程序需要注意一些事项:

  1. 如果您不在 onStop(或 onPause,如果您在 onResume 中启动它)停止处理程序仍在运行时,您的活动可能会关闭/不可见,如果您尝试更新 UI,这将导致问题
  2. 如果您的手机进入深度睡眠,处理程序将不会像您指定的那样频繁触发。我知道这一点,因为我已经使用蓝牙设备进行了一些广泛的测试,以在运行数小时后测试连接性,并且我使用了处理程序以及每次触发时的日志打印。
  3. 如果您需要此计时器持续运行,我建议将其放入比活动持续时间更长的服务中。向服务注册您的活动(通过实现服务中定义的用于与服务通信的接口)。

【讨论】:

    【解决方案2】:

    这是我在当前项目中使用的代码。正如马特所说,我使用了 TimerTask。 60000 是毫秒。 = 60 秒。我用它来刷新比赛分数。

    private void refreshTimer() {
            autoUpdate = new Timer();
            autoUpdate.schedule(new TimerTask() {
                @Override
                public void run() {
                    runOnUiThread(new Runnable() {
                        public void run() {
                            adapter = Score.getScoreListAdapter(getApplicationContext());
                            adapter.forceReload();
                            setListAdapter(adapter);
                        }
                    });
                }
            }, 0, 60000);
    

    【讨论】:

    • 它不起作用。什么是自动更新?并运行OnUiThread。减号
    • 这些问题几乎无关紧要,l0gg3r。他举了一个例子,一个任务被安排在 60 秒后运行,在 UI 线程上。任何 Android 开发人员都应该很容易理解代码。
    • 有一点,@GiantRobot。此示例的行为更像 setInterval 而不是 setTimeout。将此代码用于 setTimeout 所需的更改是:更改值的顺序(60000, 0 而不是 0, 60000)并在 run() 函数中停止计时器,使其只运行一次。
    【解决方案3】:

    underscore-java 库中有 setTimeout() 方法。

    代码示例:

    import com.github.underscore.U;
    import java.util.function.Supplier;
    
    public class Main {
    
        public static void main(String[] args) {
            final Integer[] counter = new Integer[] {0};
            Supplier<Void> incr =
                    () -> {
                        counter[0]++;
                        return null;
                    };
            U.setTimeout(incr, 100);
        }
    }
    

    该函数将在 100 毫秒内启动一个新线程。

    【讨论】:

      【解决方案4】:

      作为 Valentyn 使用 java 下划线回答的延续:

      给gradle添加依赖:

      dependencies {
          compile group: 'com.github.javadev', name: 'underscore', version: '1.15'
      }
      

      Java:

      import com.github.underscore.lodash.$;
      
      $.setTimeout(new Function<Void>() {
          public Void apply() {
              // work
              return null;
          }
      }, 1000); // 1 second
      

      【讨论】:

        猜你喜欢
        • 2014-12-06
        • 1970-01-01
        • 2014-07-27
        • 2023-03-16
        • 1970-01-01
        • 1970-01-01
        • 2017-12-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多