Я планирую внедрить пасхальное яйцо, чтобы изменить свой 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 каждый раз, когда она придерживается нового значения вместо значения, сохраненного в первый раз?
Не меняйте свой класс 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. Дайте знать, если у вас появятся вопросы
Почему бы вам не отправлять 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);
Вам нужно будет использовать 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);
}
}
});
менять
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);
URL должен быть статическим?
class ApiEndPoint {
public static String getServerLoginEndPoint(){
return SharedPreferencesHelper.getSomeStringValue(MyApp.getAppContext())
+ "/service-myverification-link/v1/link/verify";
}
....
}
Тогда ты можешь
... return Rx2AndroidNetworking.post(ApiEndPoint.getServerLoginEndPoint())
.doNotCacheResponse()...
Попробуйте преобразовать ENDPOINT_SERVER_LOGIN в:
static final String ENDPOINT_SERVER_LOGIN = SharedPreferencesHelper.getSomeStringValue(MyApp.getAppContext()) + "/service-myverification-link/v1/link/verify";