Я занимаюсь разработкой приложения для Android, которое нанимает велосипеды и использует базу данных Firebase (в реальном времени) и карты Google.
Теперь я хочу добавить таймер CountUp (в формате ЧЧ: мм: СС), который отслеживает поездку.время на сервере.
Почему это требование?
Поскольку время поездки будет начато клиентом после того, как поездка будет успешно забронирована, но закончится только человеком, управляющим циклами в цикле.стоять от своего приложения, когда велосипед возвращается.(Чтобы убедиться, что цикл был возвращен безопасно)
Как мне реализовать этот таймер в Firebase?
До сих пор я использую таймер CountUp только на стороне клиента, который использует приемник Broadcast дляотслеживать время в фоновом режиме.
Один из подходов к решению этой проблемы может заключаться в том, что клиент заканчивает поездку (только когда клиент находится в 20 метрах от места стоянки), и то же самое время сохраняется в базе данных пожарных и тех жебыть доступным для человека, управляющего стендом для велосипеда.
Но у этого подхода есть некоторые недостатки:
Что, если человек заканчивает поездку со стороны стенда и возвращает ее через час, времярассчитанное значение будет неправильным, а также ухудшит состояние доступности для следующих пользователей.
//Service Class
public class BroadcastService extends Service {
private Intent intent;
public static final String BROADCAST_ACTION = "com.xyz";
private Handler handler = new Handler();
private long initial_time;
long timeInMilliseconds = 0L;
@Override
public void onCreate() {
super.onCreate();
initial_time = SystemClock.uptimeMillis();
intent = new Intent(BROADCAST_ACTION);
handler.removeCallbacks(sendUpdatesToUI);
handler.postDelayed(sendUpdatesToUI, 1000); // 1 second
}
private Runnable sendUpdatesToUI = new Runnable() {
public void run() {
DisplayLoggingInfo();
handler.postDelayed(this, 1000); // 1 seconds
}
};
private void DisplayLoggingInfo() {
timeInMilliseconds = SystemClock.uptimeMillis() - initial_time;
int timer = (int) timeInMilliseconds / 1000;
intent.putExtra("time", timer);
sendBroadcast(intent);
}
@Override
public void onDestroy() {
super.onDestroy();
handler.removeCallbacks(sendUpdatesToUI);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
// Java class which runs when ride is active and shows the timer
public class RideIsActive extends AppCompatActivity {
private TextView timer;
private Button endRide;
Intent intent;
long timeSwapBuff = 0L;
long updatedTime = 0L;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ride_is_active);
timer = findViewById(R.id.timer);
endRide = findViewById(R.id.endRide);
startService(new Intent(this, BroadcastService.class));
endRide.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
unregisterReceiver(broadcastReceiver);
stopService(intent);
}
});
}
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
updateUI(intent);
}
};
private void updateUI(Intent intent) {
int time = intent.getIntExtra("time", 0);
Log.d("Hello", "Time " + time);
int hrs = time/3600;
int mins = time / 60;
int secs = time % 60;
timer.setText(String.format("%02d", hrs) + ":" + String.format("%02d", mins) + ":"
+ String.format("%02d", secs));
}
@Override
protected void onResume() {
super.onResume();
registerReceiver(broadcastReceiver, new IntentFilter(BroadcastService.BROADCAST_ACTION));
}
//Layout
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".RideIsActive">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/timer"
android:layout_centerInParent="true"
android:textSize="25dp"
android:textColor="#000000"
android:text="00:00:00"/>
<Button
android:id="@+id/endRide"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:text="End Ride"
android:textColor="@color/textBlack"
android:background="@color/quantum_orange500"/>
</RelativeLayout>