Метод OnChanged () сработал более двух раз - PullRequest
0 голосов
/ 10 апреля 2020

Я интегрирую insta API при получении токена авторизации onTokenReceived ().

при открытии приложения. Первый раз, когда все работает нормально, но когда я снова вернулся к той же активности после нажатия кнопки «Назад», затем после того как они метод onChanged () внутри onTokenReceived вызывается более двух раз. Я понятия не имею, как решить это. Пожалуйста, помогите мне решить эту проблему.

EditProfileActivity.class

 //instantiationg viewmodel
editProfileViewModel = new ViewModelProvider(this).get(EditProfileViewModel.class);



@Override
    public void onTokenReceived(String auth_code) {
        Log.d(TAG, "onTokenReceived: " + auth_code);

        editProfileViewModel.authInit(auth_code);
        editProfileViewModel.observe().observe(this, authToken -> {
            Log.d(TAG, "onChanged: " + authToken.getAccessToken());
            INSTA_TOKEN = authToken.getAccessToken();
            Intent intent = new Intent(EditProfileActivity.this,FbAlbumsActivity.class);
            intent.putExtra("flag" , true);
            intent.putExtra("AuthTokenClass",authToken);
            startActivityForResult(intent,INSTA_IMAGE_PIC);
        });
    }

EditProfileViewModel.class

public class EditProfileViewModel extends ViewModel {
    private static final String TAG = "EditProfileViewModel";

    private EditProfileRepo mRepo;

    private MutableLiveData<AuthToken>data = null;

    public void authInit(String code){
        if(data != null)
            return;
        mRepo = EditProfileRepo.getInstance();
        data = mRepo.getAccessToken(code);
    }

    public LiveData<AuthToken> observe(){
        return data;
    }
}

EditProfileRepo.class

publi c class EditProfileRepo {

private static final String TAG = "EditProfileRepo";
private static EditProfileRepo instance = null;
public MutableLiveData<AuthToken>data = new MutableLiveData<>();

public static EditProfileRepo getInstance(){
    if(instance == null)
        instance = new EditProfileRepo();

    return instance;
}

public MutableLiveData<AuthToken> getAccessToken(String code){
    Auth auth = AuthClient.getInstance();

    Call<AuthToken> authTokenCall = auth.getAuthToken(Constants.CLIENTID, Constants.CLIENTSECRET, "authorization_code", Constants.REDIRECTURI,
            code);


    authTokenCall.enqueue(new Callback<AuthToken>() {

        @Override
        public void onResponse(Call<AuthToken> call, Response<AuthToken> response) {
            Log.d(TAG, "onResponse: " + response.body().getAccessToken());
            data.setValue(response.body());
        }

        @Override
        public void onFailure(Call<AuthToken> call, Throwable t) {
            Log.d(TAG, "onFailure: " + t.getMessage());
        }
    });

    return data;
}

} ​​

1 Ответ

1 голос
/ 10 апреля 2020

LiveData действуют таким образом. Если вы хотите другое поведение, вы должны перезапустить inte rnet с ключевыми словами SingleEventLiveData

...