【问题标题】:Display and hide progress bar using MVVM pattern使用 MVVM 模式显示和隐藏进度条
【发布时间】:2020-01-06 00:09:00
【问题描述】:

我正在使用 MVVM 模式。我刚刚开始,我已经成功了。

但我不明白如何像我们通常对 API 调用所做的那样添加进度条来显示和隐藏。

我没有使用数据绑定。那么如何使用进度条来显示和隐藏它。

用于登录

public class LoginRepository {

private DATAModel dataModel = new DATAModel();
private MutableLiveData<DATAModel> mutableLiveData = new MutableLiveData<>();
private Application application;

public LoginRepository(Application application) {
    this.application = application;
}

public MutableLiveData<DATAModel> getMutableLiveData(String username, String password) {

    APIRequest apiRequest = RetrofitRequest.getRetrofit().create(APIRequest.class);

    JsonLogin jsonLogin = new JsonLogin(Constants.DEVICE_TYPE, Functions.getDeviceId(application.getApplicationContext()), Constants.APP_VERSION, Constants.API_VERSION, Functions.getTimeStamp(), Functions.getDeviceModel(), Build.VERSION.RELEASE, username, password);

    Call<APIResponseLogin> call = apiRequest.getUsersDetails(jsonLogin);
    call.enqueue(new Callback<APIResponseLogin>() {
        @Override
        public void onResponse(Call<APIResponseLogin> call, Response<APIResponseLogin> response) {
            APIResponseLogin apiResponse = response.body();
            if (apiResponse != null && apiResponse.getStatuscode() == 0) {
                if (apiResponse.getDataModel() != null) {
                    dataModel = apiResponse.getDataModel();
                    mutableLiveData.setValue(dataModel);
                }

            } else if (apiResponse != null && apiResponse.getStatuscode() == 1) {

                Log.v("AAAAAAAAA", apiResponse.getStatusmessage());
            }
        }

        @Override
        public void onFailure(Call<APIResponseLogin> call, Throwable t) {

            Log.v("ErrorResponse", t.getMessage() + " : " + call.request().toString());
        }
    });
    return mutableLiveData;
}

活动代码

void loginCall() {
    loginViewModel.getUserDetails(editTextUsername.getText().toString().trim(), editTextPassword.getText().toString().trim()).observe(this, new Observer<DATAModel>() {
        @Override
        public void onChanged(@Nullable DATAModel dataModel) {
            if (dataModel != null) {
                Userdetails userdetails = dataModel.getUserdetails();
                List<ContactTypes> contactTypes = dataModel.getContactTypes();
                if (userdetails != null) {

                    MySharedPreferences.setCustomPreference(LoginActivity.this, Constants.SHAREDPREFERENCE_USERDETAILS, userdetails);
                    MySharedPreferences.setStringPreference(LoginActivity.this, Constants.SHAREDPREFERENCE_USER_ID, userdetails.getUserId());
                }

                if (contactTypes != null) {
                    MySharedPreferences.setCustomArrayList(LoginActivity.this, Constants.SHAREDPREFERENCE_CONTACTTYPES, contactTypes);
                }

                Intent i = new Intent(LoginActivity.this, MainActivity.class);
                startActivity(i);
                finish();
            }
        }
    });
}

我们将不胜感激高级帮助!

【问题讨论】:

  • 分享你的代码 sn-p..
  • 代码已更新......
  • 请添加您的活动或片段代码

标签: android mvvm android-progressbar


【解决方案1】:

当您调用 api 时,您必须获取一个显示您的 api 是否处于加载模式的实时变量,并且在成功或失败后您必须更新该变量。

在您的活动或片段类中观察该变量并显示或隐藏您的进度。

public class LoginRepository {
    
      private DATAModel dataModel = new DATAModel();
      private MutableLiveData<DATAModel> mutableLiveData = new MutableLiveData<>();
      private Application application;
      private MutableLiveData<Boolean> progressbarObservable;
    
      public LoginRepository(Application application) {
          this.application = application;
      }

      public MutableLiveData<DATAModel> getMutableLiveData(String username, String password) {
         // add below line
         progressbarObservable.value = true
         APIRequest apiRequest = RetrofitRequest.getRetrofit().create(APIRequest.class);

    JsonLogin jsonLogin = new JsonLogin(Constants.DEVICE_TYPE, Functions.getDeviceId(application.getApplicationContext()), Constants.APP_VERSION, Constants.API_VERSION, Functions.getTimeStamp(), Functions.getDeviceModel(), Build.VERSION.RELEASE, username, password);

    Call<APIResponseLogin> call = apiRequest.getUsersDetails(jsonLogin);
    call.enqueue(new Callback<APIResponseLogin>() {
        @Override
        public void onResponse(Call<APIResponseLogin> call, Response<APIResponseLogin> response) {
            // add below line
            progressbarObservable.value = false
            APIResponseLogin apiResponse = response.body();
            if (apiResponse != null && apiResponse.getStatuscode() == 0) {
                if (apiResponse.getDataModel() != null) {
                    dataModel = apiResponse.getDataModel();
                    mutableLiveData.setValue(dataModel);
                }

            } else if (apiResponse != null && apiResponse.getStatuscode() == 1) {

                Log.v("AAAAAAAAA", apiResponse.getStatusmessage());
            }
        }

        @Override
        public void onFailure(Call<APIResponseLogin> call, Throwable t) {
            // add below line
            progressbarObservable.value = false
            Log.v("ErrorResponse", t.getMessage() + " : " + call.request().toString());
        }
    });
    return mutableLiveData;
    }
    }

现在,观察活动或片段中的上述变量,并根据该值隐藏或显示您的进度条

    public class LoginActivity extends AppCompatActivity {
      ...
    
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        ...
        
        observeLogin();
      }

       @Override
       public void onClick(View view) 
       { 
         switch (view.getId()) { 
            case R.id.button_login: 
            // Do something 
            loginCall();
          } 
       } 
      
      private void observeLogin() {
        loginViewModel.progressbarObservable().observe(this, new  Observer<Boolean>() {
          @Override
          public void onChanged(final Boolean progressObserve) {
            if(progressObserve){
               show your progress
            }
            else {
               hide your progress
            }
          }
        });
      }

void loginCall() {
    loginViewModel.getUserDetails(editTextUsername.getText().toString().trim(), editTextPassword.getText().toString().trim()).observe(this, new Observer<DATAModel>() {
        @Override
        public void onChanged(@Nullable DATAModel dataModel) {
            if (dataModel != null) {
                Userdetails userdetails = dataModel.getUserdetails();
                List<ContactTypes> contactTypes = dataModel.getContactTypes();
                if (userdetails != null) {

                    MySharedPreferences.setCustomPreference(LoginActivity.this, Constants.SHAREDPREFERENCE_USERDETAILS, userdetails);
                    MySharedPreferences.setStringPreference(LoginActivity.this, Constants.SHAREDPREFERENCE_USER_ID, userdetails.getUserId());
                }

                if (contactTypes != null) {
                    MySharedPreferences.setCustomArrayList(LoginActivity.this, Constants.SHAREDPREFERENCE_CONTACTTYPES, contactTypes);
                }

                Intent i = new Intent(LoginActivity.this, MainActivity.class);
                startActivity(i);
                finish();
            }
        }
    });
}
      
    }

【讨论】:

  • 好的。但是您能否请活动 sn-p 代码以在活动中使用 progressbarObservable。我刚刚开始使用 MVVM 模式。
  • 那么我是否需要同时使用 loginViewModel.getUserDetails() 两者?
  • 只要任何值发生变化(在布尔变量或 loginresponse 中)观察者自动观察值时,只需将上面的代码和现有代码放在上面
  • 好的意味着 loginViewModel.getUserDetails() 将在 loginViewModel.progressbarObservable()onChanged() 方法中?
  • 好的。让我用。谢谢 :) 我会回复你的
【解决方案2】:

我发现在这种情况下编写自己的回调接口更容易。只是这不是同步完成的,所以所有人都会等到您的 api 调用响应。但在这种情况下,进度对话框也会产生类似的效果。

1.创建接口:

public interface ProgressCallback{  
  void onDone(String message);

   void onFail(String message); 
}
  1. 现在在您调用 API 的方法中

loginUser(字符串名称、字符串密码、ProgressCallback 进度回调){

    call.enqueue(new Callback<LoginData>() {
                @RequiresApi(api = Build.VERSION_CODES.O)
                @Override
                public void onResponse(Call<LoginData> call, Response<LoginData>           response) {
                    progressCallBack.onSuccess(response.message());
                }
    
            @Override
            public void onFailure(Call<LoginData> call, Throwable t) {
    
                progressCallBack.onFail(t.getMessage());
            }
        });
  1. 现在当你调用方法时
loginUser("John@doe.com", "applesgravity", new ProgressCallBack() {
                   @Override
                   public void onSuccess(String message) {
                       progressBar.setVisibility(View.INVISIBLE);
                   }

                   @Override
                   public void onFail(String message) {
                       progressBar.setVisibility(View.INVISIBLE);
                   }
               });

【讨论】:

    猜你喜欢
    • 2020-01-24
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-03
    • 1970-01-01
    • 2011-04-01
    相关资源
    最近更新 更多