2016-10-01 35 views
0

我想要一個具有完全ProgressDialog的Splash屏幕,並通過Presenter類(來自MVP體系結構)內的異步調用來更新其進度。什麼是從後臺線程異步更新ProgressDialog進度的好方法?

我對我的BaaS服務器進行了大量的API調用,對於每次成功調用,我都想更新進度條。

完成此操作的最佳方法是什麼?

我一直在嘗試使用EventBus發送通知給我的SplashActivity,但似乎所有的API調用都是第一次完成,只有這樣總線通知纔會消耗並更新UI。

我迄今所做的是:

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); 
    } 

主講

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調用,併爲每一個電話,我更新與查看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架構。

乾杯

相關問題