【问题标题】:Stopwatch resets when activity restarts活动重新开始时秒表重置
【发布时间】:2021-07-08 06:07:09
【问题描述】:

我正在尝试为我的统计活动创建简单的秒表。它需要做的是在活动第一次创建时开始,然后计数直到我重置它。我使用的代码:

    String trip_time;
    long millis;
    long start_time;
    Handler Handler;
    private boolean started = false;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Handler.postDelayed(Runnable, 10L);
        if (!started) {
            start_time = System.currentTimeMillis();
            started = true;
        }
     }

  private final Runnable Runnable = new Runnable() {
        @Override
        public void run() {
            millis = (System.currentTimeMillis() - start_time);
            long seconds = millis / 1000;
            trip_time = String.format(Locale.getDefault(), "%02d:%02d:%02d", seconds / 3600, seconds / 60, seconds % 60);
            Handler.postDelayed(Runnable, 10L);
        }
    };

但是,当我有意进行活动或活动重新启动时,秒表会重置并从 0 开始计数。经过几次重置后,它会继续从基本时间开始计数。我能以某种方式摆脱这个问题吗?可能通过课程或其他方式。

【问题讨论】:

  • 您可以在 ViewModel 类中添加计时器并在活动中获取时间。因此,当活动重新创建、配置更改等时,您的数据不会破坏。
  • 你必须保存类变量 onSaveInstanceState 并在 onCreate 中恢复它们

标签: java android android-activity stopwatch


【解决方案1】:

谢谢,我通过制作 StopwatchService 解决了我的问题:

public class StopwatchService extends Service {

    Handler Handler;
    long start_time;
    static String trip_time;
    static long millis;

    @Override
    public void onCreate() {
        super.onCreate();
        Handler = new Handler();
        Handler.postDelayed(Runnable, 10L);
        start_time = System.currentTimeMillis();

    }
    private final Runnable Runnable = new Runnable() {
        @Override
        public void run() {
            millis = (System.currentTimeMillis() - start_time);
            long seconds = millis / 1000;
            trip_time = String.format(Locale.getDefault(), "%02d:%02d:%02d", seconds / 3600, seconds / 60, seconds % 60);
            Handler.postDelayed(Runnable, 10L);
        }
    };
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    public static String getTrip_time(){return trip_time;}
}

在清单中:

 <service 
    android:name=".StopwatchService"
    android:enabled="true"/>

在活动中:

 startService(new Intent(this, StopwatchService.class));
 String trip_time = StopwatchService.getTrip_time();

【讨论】:

  • 太好了。那你能支持我的回答吗?
  • 对不起,我没有足够的声望投票
【解决方案2】:

以下代码每次都会重置秒表,因为当您返回此活动时,它将启动一个新的可运行文件并在 UI 上显示。

您需要能够连接到先前数据的东西。您可以使用 Service,即使您的应用已从后台删除,每次返回此活动时都会绑定。或者,您可以在 Shared Preferences / Datastore 上保存上次时间和经过时间,然后通过添加总经过时间来启动活动计时器。

【讨论】:

  • 你能提供一些如何制作的代码吗?提前致谢。
  • 如果您指定要实现该功能的方式,我可以参考。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多