2017-12-08 22 views
0

Google Room을 사용하여 Android 앱 (Kotlin 코드)에서 데이터 지속성을 구현하고 있습니다. 방은 모든 작업 (데이터베이스와의 쿼리)을 비동기로 요구합니다. 사용자가 작업이 실행될 때까지 기다려서 쿼리가 끝나기 전에 제대로 구성되지 않은 구성 요소와 상호 작용하지 못하게하고 싶습니다. 비동기 작업에서 UI 스레드에 액세스 할 수 없으므로 어떻게이 작업을 수행 할 수 있습니까?Google Room에서 사용하는 비동기 작업 진행 상황을 올바르게 표시하는 방법

추신 : 진행률 /로드 표시기가있는 API에 대한 호출도 있습니다. 나는이 호출에서 RxJava를 사용하고 있지만, 나는이 기술을 처음 접했고 제대로 구조화하는 방법을 모르겠습니다. DB를 작업의

샘플 :

private fun getDataFromCache() { 
    //show progress indicator here 
     execute({ 
      try { 
       //Get items from cache 
       val entities = daoData.findAll() 

       if (entities.isNotEmpty()) { 
        //do something 
       } else { 
        //do something else 
       } 
      } 
      catch (e: Exception){ 
       Log.e("error", e.toString()) 
      } 
      finally{ 
       //dismiss progress indicator here 
      } 
     }) 
    } 

답변

0

가있는 선택적으로 할 수있는, 당신이 KProgressHUD 같은 라이브러리를 사용할 수 있습니다 노력하고 있습니다 페치 모달을 표시하면서 사용자 인터페이스는 HUD를 차단, 응용 프로그램을 사용하는 사용자를 방지하기 위해 진행률 표시기를 포함하십시오. show progress indicator here 설명을 모달 HUD 생성으로 바꾸고 //dismiss progress indicator here을 UI 스레드에서 HUD를 제거하기 만하면됩니다.

진도와 관련하여 코드 execute 내부의 HUD 진행률을 수동으로 업데이트해야합니다. 먼저 dao findAll()을 호출하여 전체 진행 막대의 기간을 알기 위해 합계 한 요소 수 (일부 SELECT COUNT(*) 쿼리)를 반환하는 호출로 분할해야합니다. 그런 다음 findAll() 대신 데이터베이스에 일괄 호출/호출 호출을 만들어 루프에서 N 개의 레코드를 가져와야합니다. 이 루프 내에서 HUD를 현재 진행중인 루프의 백분율과 시작 전 총 카운트로 업데이트 할 수 있습니다.

룸 API에 익숙하지 않아서 이러한 루프에서 의사 코드를 제공 할 수는 없지만 일반적으로 SQL 커서를 열어 루프가 끝날 때까지 루프에서 데이터 일괄 처리를 계속 가져옵니다. 얼마나 많은 사람들이 항목을 읽고 목록에 축적했는지 추적합니다.

+0

환호하는 사람, 우리는 비슷한 접근을했습니다! –