diff --git a/app/src/main/java/com/example/tampopo_client/viewmodels/ActivityViewModel.java b/app/src/main/java/com/example/tampopo_client/viewmodels/ActivityViewModel.java index 3876ffd..31b884f 100644 --- a/app/src/main/java/com/example/tampopo_client/viewmodels/ActivityViewModel.java +++ b/app/src/main/java/com/example/tampopo_client/viewmodels/ActivityViewModel.java @@ -4,7 +4,6 @@ import androidx.annotation.NonNull; import androidx.lifecycle.MutableLiveData; -import androidx.lifecycle.ViewModel; import com.example.tampopo_client.models.Activity; import com.example.tampopo_client.resources.ActivitiesResource; @@ -13,10 +12,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; import retrofit2.Call; import retrofit2.Callback; @@ -32,20 +27,20 @@ * @author Shohei Yamagiwa * @implNote Repositoryは作成せずに、すべてViewModelで処理する */ -public class ActivityViewModel extends ViewModel { +public class ActivityViewModel extends RealTimeViewModel { private final ActivitiesResource activitiesResource; private final UserResource userResource; private final MutableLiveData> activitiesLiveData; // key=userId, value=activity private final MutableLiveData> friendUserIdsLiveData; - private final ScheduledExecutorService fetchActivitiesTaskScheduler; - private ScheduledFuture fetchActivitiesTask; + private final String userId; + private final String token; - private final ScheduledExecutorService fetchFriendIdsTaskScheduler; - private ScheduledFuture fetchFriendIdsTask; + public ActivityViewModel(String userId, String token) { + this.userId = userId; + this.token = token; - public ActivityViewModel() { // Retrofitの初期化 final Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://nitta-lab-www.is.konan-u.ac.jp/tampopo/") @@ -57,68 +52,30 @@ // LiveDataの初期化 activitiesLiveData = new MutableLiveData<>(Map.of()); friendUserIdsLiveData = new MutableLiveData<>(List.of()); - - // スケジューラーの作成 - fetchActivitiesTaskScheduler = Executors.newSingleThreadScheduledExecutor(); - fetchFriendIdsTaskScheduler = Executors.newSingleThreadScheduledExecutor(); } @Override - protected void onCleared() { - super.onCleared(); - - // ViewModelの破棄時にタスクを即停止する - if (fetchActivitiesTaskScheduler != null) { - fetchActivitiesTaskScheduler.shutdownNow(); - } - if (fetchFriendIdsTaskScheduler != null) { - fetchFriendIdsTaskScheduler.shutdownNow(); - } - } - - /** - * 定期的に最新のアクティビティ一覧を取得・更新する - */ - public void startFetchingLatestActivities() { - if (fetchActivitiesTask != null && !fetchActivitiesTask.isDone()) { - return; - } - - final Runnable task = () -> { - if (!friendUserIdsLiveData.isInitialized()) { + public Runnable onUpdate() { + return () -> { + if (activitiesLiveData == null || friendUserIdsLiveData == null) { return; } - if (friendUserIdsLiveData.getValue() == null) { - return; + + // 最新のアクティビティを取得して更新する + if (friendUserIdsLiveData.isInitialized() && friendUserIdsLiveData.getValue() != null) { + for (String userId : friendUserIdsLiveData.getValue()) { + pullLatestActivity(userId); + } } - for (String userId : friendUserIdsLiveData.getValue()) { - pullLatestActivity(userId); + + // 最新のフレンドのユーザーIDを取得して更新する + if (friendUserIdsLiveData.isInitialized()) { + pullLatestFriendUserIds(userId, token); } + + // Logging + Log.d(ActivityViewModel.class.getSimpleName(), "Polling data from the server."); }; - fetchActivitiesTask = fetchActivitiesTaskScheduler.scheduleWithFixedDelay(task, 0, 1, TimeUnit.SECONDS); - } - - /** - * 定期的に最新のフレンド一覧を取得・更新する - * - * @param userId ユーザーID - * @param token ユーザーの認証用トークン - */ - public void startFetchingLatestFriends(String userId, String token) { - if (fetchFriendIdsTask != null && !fetchFriendIdsTask.isDone()) { - return; - } - - final Runnable task = () -> { - if (!friendUserIdsLiveData.isInitialized()) { - return; - } - - pullLatestFriendUserIds(userId, token); - - Log.d(ActivityViewModel.class.getSimpleName(), "Polling friends data from the server."); - }; - fetchFriendIdsTask = fetchFriendIdsTaskScheduler.scheduleWithFixedDelay(task, 0, 1, TimeUnit.SECONDS); } public void createActivity(String userId, String token, String newActivity) { @@ -232,4 +189,12 @@ public MutableLiveData> getFriendUserIdsLiveData() { return friendUserIdsLiveData; } + + public String getUserId() { + return userId; + } + + public String getToken() { + return token; + } }