2016-10-01 31 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架构。

干杯

相关问题