Как обновить значение статического контекста, сохраненное из общих настроек?

4

Я планирую внедрить пасхальное яйцо, чтобы изменить свой API с помощью alertdialog, но в настоящее время после того, как я изменяю свою конечную точку URL и отправляю ее, она сохраняет ее в общих настройках, но в следующий раз, когда я ее сохраняю, она сохраняет ее в общих настройках, но не отражается в приложении. Как мне сделать так, чтобы каждый раз, когда я менял его, он относился к моей точке apiendpoint, как и ожидалось:

Alertdialog который срабатывает на 5 нажатий:

    myimage.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      long time= System.currentTimeMillis();


                      //if it is the first time, or if it has been more than 3 seconds since the first tap ( so it is like a new try), we reset everything
                      if (startMillis==0 || (time-startMillis> 3000) ) {
                          startMillis=time;
                          count=1;
                      }
                      //it is not the first, and it has been  less than 3 seconds since the first
                      else{ //  time-startMillis< 3000
                          count++;
                      }

                      if (count==5) {
                          final AlertDialog dialogBuilder = new AlertDialog.Builder(LoginActivity.this).create();
                          LayoutInflater inflater = LoginActivity.this.getLayoutInflater();
                          View dialogView = inflater.inflate(R.layout.custom_dialog, null);

                          final EditText editText = (EditText) dialogView.findViewById(R.id.edt_comment);
                          Button submitButton = (Button) dialogView.findViewById(R.id.buttonSubmit);
                          Button cancelButton = (Button) dialogView.findViewById(R.id.buttonCancel);
                          Button resetButton = (Button) dialogView.findViewById(R.id.buttonReset);
                          editText.setTextColor(getResources().getColor(R.color.black,null));
                          if(SharedPreferencesHelper.getSomeStringValue(getApplicationContext()) != null) {
                              editText.setText( SharedPreferencesHelper.getSomeStringValue(getApplicationContext()));
                          }

                          cancelButton.setOnClickListener(new View.OnClickListener() {
                              @Override
                              public void onClick(View view) {

                                  dialogBuilder.dismiss();
                              }
                          });
                          submitButton.setOnClickListener(new View.OnClickListener() {
                              @Override
                              public void onClick(View view) {
                                  //save the endpoint value in shared preferences
SharedPreferencesHelper.setSomeStringValue(getApplicationContext(),editText.getText().toString());


                                  dialogBuilder.dismiss();
                              }
                          });
                          resetButton.setOnClickListener(new View.OnClickListener() {
                              @Override
                              public void onClick(View v) {
                                  SharedPreferencesHelper.setSomeStringValue(getApplicationContext(),BuildConfig.BASE_URL);

                                  dialogBuilder.dismiss();

                              }
                          });

                          dialogBuilder.setView(dialogView);
                          dialogBuilder.setCanceledOnTouchOutside(false);
                          dialogBuilder.show();
                      }
                  }



        });

Вот мой общий справочный справочник:

public class SharedPreferencesHelper {

    private static final String APP_SETTINGS = "APP_SETTINGS";


    // properties
    private static final String SOME_STRING_VALUE = "SOME_STRING_VALUE";
    // other properties...


    private SharedPreferencesHelper() {}

    private static SharedPreferences getSharedPreferences(Context context) {
        return context.getSharedPreferences(APP_SETTINGS, Context.MODE_PRIVATE);
    }

    public static String getSomeStringValue(Context context) {
        return getSharedPreferences(context).getString(SOME_STRING_VALUE , null);
    }

    public static void setSomeStringValue(Context context, String newValue) {
        final SharedPreferences.Editor editor = getSharedPreferences(context).edit();
        editor.putString(SOME_STRING_VALUE , newValue);
        editor.apply();
    }

}

Наконец, вот мой Apiendpoint class:

final class ApiEndPoint {
 private static String NEW_URL = SharedPreferencesHelper.getSomeStringValue(MyApp.getAppContext());
    static final String ENDPOINT_SERVER_LOGIN = NEW_URL
            + "/service-myverification-link/v1/link/verify";

    private ApiEndPoint() {
        // This class is not publicly instantiable
    }
}

Для приведенного выше кода мне было интересно, как сделать ссылку NEW_URL более динамичной, похоже, что она придерживается значения, сохраненного в первый раз, и не меняется после. Мне нужно сохранить эту ссылку в статическом состоянии из-за:

 @Override
    public Single<LoginResponse> doServerLoginApiCall(LoginRequest request) {
            return Rx2AndroidNetworking.post(ApiEndPoint.ENDPOINT_SERVER_LOGIN)
                    .doNotCacheResponse()
                    .addBodyParameter(request)
                    .build()
                    .getObjectSingle(LoginResponse.class);

    }

Любая идея, как я могу это исправить, чтобы я мог обновлять ссылку в NEW_URL каждый раз, когда она придерживается нового значения вместо значения, сохраненного в первый раз?

Теги:
sharedpreferences
android-alertdialog
android-savedstate

6 ответов

1

Не меняйте свой класс apiendpoint. Попробуй это:

@Override
    public Single<LoginResponse> doServerLoginApiCall(LoginRequest request) {
            return Rx2AndroidNetworking.post(processUrl(ApiEndPoint.ENDPOINT_SERVER_LOGIN))
                    .doNotCacheResponse()
                    .addBodyParameter(request)
                    .build()
                    .getObjectSingle(LoginResponse.class);
    }

Где в вашем классе помощника вы можете добавить:

 private String processUrl(String url) {
        String baseUrl = mPreferencesHelper.getBaseUrl();
        if (baseUrl != null) {
            return url.replace(BuildConfig.BASE_URL, baseUrl);
        } else {
            return url;
        }
    }

В вашем классе preferencehelper определите:

 String getBaseUrl();

    void setBaseUrl(String baseUrl);

ссылка на вспомогательный класс:

private final SharedPreferences mPrefs;

  @Override
    public String getBaseUrl() {
        return mPrefs.getString(PREF_KEY_BASE_URL, null);
    }

    @Override
    public void setBaseUrl(String baseUrl) {
        mPrefs.edit().putString(PREF_KEY_BASE_URL, baseUrl).apply();
    }

Наконец, в вашем основном классе:

 @Override
    public String getBaseUrl() {
        String baseUrl = preferenceshelper.getBaseUrl();
        if (baseUrl == null) {
            return BuildConfig.BASE_URL;
        } else {
            return baseUrl;
        }
    }


@Override
public void setBaseUrl(String baseUrl) {
    preferenceshelper.setBaseUrl(baseUrl);
}

и в вашем счете == 5 функция:

  submitButton.setOnClickListener(view -> {
                        setBaseUrl(editText.getText().toString());
                        dialogBuilder.dismiss();
                    });
                    resetButton.setOnClickListener(v1 -> {
                        setBaseUrl(BuildConfig.BASE_URL);
                        dialogBuilder.dismiss();
                    });

Вот и все. Вам может понадобиться подключить некоторые основы для установки и войти в Presenter, если вы используете шаблон mvp. Дайте знать, если у вас появятся вопросы

0

Почему бы вам не отправлять URL в качестве параметра каждый раз:

@Override
    public Single<LoginResponse> doServerLoginApiCall(LoginRequest request, String url) {
            return Rx2AndroidNetworking.post(url)
                    .doNotCacheResponse()
                    .addBodyParameter(request)
                    .build()
                    .getObjectSingle(LoginResponse.class);
    }

Вызов метода:

doServerLoginApiCall(request, SharedPreferencesHelper.getSomeStringValue(getApplicationContext()) + ENDPOINT);
0

Вам нужно будет использовать onSharedPreferenceChangeListener

 SharedPreferencesHelper.getSharedPreferences(context).registerOnSharedPreferenceChangeListener(
  new SharedPreferences.OnSharedPreferenceChangeListener() {
    public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
       if(key.equals("SOME_STRING_VALUE")){
          NEW_URL = prefs.getString("SOME_STRING_VALUE" , null);
       }
  }
});
  • 0
    где я могу разместить это в своей деятельности на резюме? у меня new_url определен только в apiendpoint, как это будет работать?
-1

менять

final class ApiEndPoint {
 private static String NEW_URL = SharedPreferencesHelper.getSomeStringValue(MyApp.getAppContext());
    static final String ENDPOINT_SERVER_LOGIN = NEW_URL
            + "/service-myverification-link/v1/link/verify";

    private ApiEndPoint() {
        // This class is not publicly instantiable
    }
}

в

final class ApiEndPoint {

    public static String newURL(Context context) {
        return SharedPreferencesHelper.getSomeStringValue(context) + "/service-myverification-link/v1/link/verify";
    }

    private ApiEndPoint() {
        // This class is not publicly instantiable
    }
}

и вызвать его с помощью ApiEndpoint.newURL(this);

-1

URL должен быть статическим?

 class ApiEndPoint {

     public static String getServerLoginEndPoint(){
         return SharedPreferencesHelper.getSomeStringValue(MyApp.getAppContext()) 
              + "/service-myverification-link/v1/link/verify";
     }

       ....
    }

Тогда ты можешь

... return Rx2AndroidNetworking.post(ApiEndPoint.getServerLoginEndPoint())
    .doNotCacheResponse()...
-1

Попробуйте преобразовать ENDPOINT_SERVER_LOGIN в:

static final String ENDPOINT_SERVER_LOGIN = SharedPreferencesHelper.getSomeStringValue(MyApp.getAppContext())
        + "/service-myverification-link/v1/link/verify";

Ещё вопросы

Сообщество Overcoder
Наверх
Меню