2016-10-01 4 views
0

Я хочу иметь экран заставки, который имеет расширенный ProgressDialog, и его прогресс обновляется асинхронными вызовами из класса Presenter (из архитектуры MVP).Каков хороший способ асинхронного обновления ProgressDialog из фонового потока?

У меня есть ряд вызовов API для моего сервера BaaS, и для каждого успешного вызова я хотел бы обновить индикатор выполнения.

Каков наилучший способ для этого?

Я пытаюсь использовать EventBus для отправки уведомлений в свой SplashActivity, но кажется, что все вызовы API сначала завершены, и только тогда уведомления о шине становятся потребляемыми и обновляя интерфейс.

То, что я сделал до сих пор является:

SplashActivity:

@Subscribe(threadMode = ThreadMode.MAIN) 
    public void onProgressBar(String event) { 
     Timber.d("onProgressBar"); 
     if(event.contains("Done")) { 
      roundCornerProgressBar.setProgress(100); 
     } else { 
      roundCornerProgressBar.setProgress(roundCornerProgressBar.getProgress() + 10); 
     } 
     textViewTips.setText(event); 
    } 

Presenter:

InstanceID iid = InstanceID.getInstance(ctx); 
String id = iid.getId(); 
mDataManager.getPreferencesHelper().putInstanceId(id); 
GSUtil.instance().deviceAuthentication(id, "android", mDataManager); 
GSUtil.instance().getPropertySetRequest("PRTSET", mDataManager); 

GSUtil:

public void deviceAuthentication(String deviceId, String deviceOS, final DataManager mDataManager) { 
     gs.getRequestBuilder().createDeviceAuthenticationRequest() 
       .setDeviceId(deviceId) 
       .setDeviceOS(deviceOS) 
       .send(new GSEventConsumer<GSResponseBuilder.AuthenticationResponse>() { 
        @Override 
        public void onEvent(GSResponseBuilder.AuthenticationResponse authenticationResponse) { 
         if(mDataManager != null) { 
          mDataManager.getPreferencesHelper().putGameSparksUserId(authenticationResponse.getUserId()); 
         } 
         EventBus.getDefault().post("Reading player data"); 
        } 
       }); 
    } 

public void getPropertySetRequest(String propertySetShortCode, final DataManager mDataManager) { 
     gs.getRequestBuilder().createGetPropertySetRequest() 
       .setPropertySetShortCode(propertySetShortCode) 
       .send(new GSEventConsumer<GSResponseBuilder.GetPropertySetResponse>() { 
        @Override 
        public void onEvent(GSResponseBuilder.GetPropertySetResponse getPropertySetResponse) { 
         GSData propertySet = getPropertySetResponse.getPropertySet(); 
         GSData scriptData = getPropertySetResponse.getScriptData(); 
         try { 
          JSONObject jObject = new JSONObject(propertySet.getAttribute("max_tickets").toString()); 
          mDataManager.getPreferencesHelper().putGameDataMaxTickets(jObject.getInt("max_tickets")); 
          jObject = new JSONObject(propertySet.getAttribute("tickets_refresh_time").toString()); 
          mDataManager.getPreferencesHelper().putGameDataTicketsRefreshTime(jObject.getLong("refresh_time")); 
         } catch (JSONException e) { 
          e.printStackTrace(); 
         } 
         EventBus.getDefault().post("Game data ready"); 
         EventBus.getDefault().post("Done!"); 
        } 
       }); 
    } 

Прямо сейчас я просто показываю вам 2 API вызовы, но мне нужно будет другой 2. Спасибо

ответ

0

Я нашел ответ! Это легче, что я думал, что прискорбно, как я провожу около 4 часов на этом:

Во-первых, я создал два новых метода на моем MVPView интерфейса:

public interface SplashMvpView extends MvpView { 

    void updateProgressBarWithTips(float prog, String tip); 
    void gameDataLoaded(); 
} 

Затем, в самой презентации, я называю каждый вызов API и для каждого вызова, я обновляю View с updateProgressBarWithTips метод и когда все закончено, я завершить его, так что я могу перейти от экрана выплеска на главный экран:

private void doGSData(String id) { 
     getMvpView().updateProgressBarWithTips(10, "Synced player data"); 
     GSAndroidPlatform.gs().getRequestBuilder().createDeviceAuthenticationRequest() 
       .setDeviceId(id) 
       .setDeviceOS("android") 
       .send(new GSEventConsumer<GSResponseBuilder.AuthenticationResponse>() { 
        @Override 
        public void onEvent(GSResponseBuilder.AuthenticationResponse authenticationResponse) { 
         if(mDataManager != null) { 
          mDataManager.getPreferencesHelper().putGameSparksUserId(authenticationResponse.getUserId()); 
         } 

         getMvpView().updateProgressBarWithTips(10, "Synced game data"); 
         GSAndroidPlatform.gs().getRequestBuilder().createGetPropertySetRequest() 
           .setPropertySetShortCode("PRTSET") 
           .send(new GSEventConsumer<GSResponseBuilder.GetPropertySetResponse>() { 
            @Override 
            public void onEvent(GSResponseBuilder.GetPropertySetResponse getPropertySetResponse) { 
             GSData propertySet = getPropertySetResponse.getPropertySet(); 
             GSData scriptData = getPropertySetResponse.getScriptData(); 
             try { 
              JSONObject jObject = new JSONObject(propertySet.getAttribute("max_tickets").toString()); 
              mDataManager.getPreferencesHelper().putGameDataMaxTickets(jObject.getInt("max_tickets")); 
              jObject = new JSONObject(propertySet.getAttribute("tickets_refresh_time").toString()); 
              mDataManager.getPreferencesHelper().putGameDataTicketsRefreshTime(jObject.getLong("refresh_time")); 
             } catch (JSONException e) { 
              e.printStackTrace(); 
             } 
             getMvpView().gameDataLoaded(); 
            } 
           }); 
        } 
       }); 
    } 

Я надеюсь, что это поможет кому-то, если вы используете MVP-архитектуру.

Cheers

Смежные вопросы