서버의 모든 API 마다 서버 점검일 때는 서버 점검 응답을 주나요, 아니면 서버 점검 API는 별도로 존재하고 님이 알아서 주기적으로 호출해야 하는 건가요?
첫번째는 처리가 명료하니까 두번째의 경우라고 가정하고 말씀드릴게요.
API를 호출하는 wrapper 클래스를 하나 만드세요. (함수를 만드셔도 가능할 것 같네요) 아래처럼 wrapper 안에서 서비스를 호출하기 전에 서버 점검 API를 먼저 호출하세요. 서버 점검 중이라면 서버 점검에러를 먼저 리턴하도록 해보세요.
class ApiInvokeWrapper(
private val checkSystemService: SystemCheckService,
private val apiService: ApiService
) {
fun callService(action: (ApiService) -> Unit) {
val systemCheckResult = checkSystemService.invoke()
if (checkSystemService.invoke() == SystemCheckResult.InMaintenance) {
return systemCheckResult
}
action(apiService)
}
}
class SystemCheckService {
fun invoke(): SystemCheckResult
}
class ApiService {
}
대략적으로 위와 비슷하게 할 수 있을 것 같습니다만, 님이 구체적인 상황에 따라 구현내용도 달라질겁니다.
OkHttp를 사용하실 경우는
Authenticator라는 것을 이용하시면 다른 API호출 전에 서버 점검 API를 호출하시면 체크하실 수 있을 듯합니다. https://square.github.io/okhttp/3.x/okhttp/okhttp3/Authenticator.html
그리고 찾아보니 Interceptor 안에서 Dialog를 띄울 수 있는 방법은
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
선언하시고 ApplicationContext를 사용하시는 방법이 있습니다. 다른 방법으로는 BroadCastReceiver 를 이용할 수도 있겠네요.
그리고 ApplicationContext를 사용하실 거면 바로 interceptor에서 사용하시지 마시고 인터페이스나 wrapper로 한번 감싸서 사용하세요.
interface SystemMaintenanceAlert {
fun handleMaintenanceMessage()
}
class SystemMaintenanceAlertImpl(
private appContext: Context
) {
override fun handleMaintenanceMessage() {
// Show dialog
}
}
class SystemMaintenaceInterceptor (
private val systemMaintenaceAlert: SystemMaintenanceAlert
) implements Interceptor {
if (systemMaintenaceInProgress()) {
return systemMaintenaceAlert.handleMaintenanceMessage()
}
}
다른 가능한 방법으로는 Interceptor를 Singleton으로 만들고 MainActivity같이 백스택에 계속 유지는 곳에서 Listner를 달아서 이벤트를 받는 방법도 생각해 볼 수 있을 것 같습니다.
object SystemMaintenaceInterceptor implements Interceptor {
interface Listener {
fun onSystemMaintenane()
}
var listener: Listener?= null
override fun intercept(Interceptor.Chain chain): Response {
if (systemMaintenaceInProgress() && listener != null) {
return listener.onSystemMaintenane()
}
}
}
class MainActivity: AppCompatActivity, SystemMaintenaceInterceptor.Listener {
fun onCreate(saveInstance: Bundle) {
super.onCreate(saveInstance)
SystemMaintenaceInterceptor.listener = this
}
override fun onSystemMaintenane() {
// show message
}
}