什么是从后台线程异步更新ProgressDialog进度的好方法?

时间:2016-10-01 05:09:07

标签: android android-asynctask greenrobot-eventbus

我希望有一个Splash屏幕,其中包含一个不连续的ProgressDialog,并且它的进度会通过Presenter类(来自MVP架构)中的异步调用进行更新。

我有多个API调用要发送到我的BaaS服务器,每次成功调用,我都想更新进度条。

实现这一目标的最佳方式是什么?

我一直在尝试使用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个。 谢谢

1 个答案:

答案 0 :(得分:0)

我找到了答案!我觉得这很容易,因为我花了大约4个小时就不幸了:

首先,我在MVPView界面上创建了两个新方法:

public interface SplashMvpView extends MvpView {

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

然后,在演示者本身,我调用每个API调用,每次调用,我用updateProgressBarWithTips方法更新视图,当一切都完成后,我最终确定它,以便我可以从Splash屏幕移动到Main屏幕:

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架构,我希望这对某人有所帮助。

干杯