Дооснащение API не работает в методе onNavigationItemSelected и во фрагменте - PullRequest
0 голосов
/ 09 января 2019

Модификация call.enqueue не дает никакого ответа (успех / сбой) в методе Fragement и onNavigationItemSelected для BottomNavigationView

В методе userProfileDetails я вызвал Retrofit client. При выполнении кода ответ API застревает в методе call.enqueue, а метод onResponse или onFailure не вызывается в методе onNavigationItemSelected Тот же метод прекрасно работает на методе Create для соответствующей Activity. Та же проблема происходит в классе UserProfileFragment.

@Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        Fragment fragment = null;
        switch (item.getItemId()){
            case R.id.menu_landingorder:
                fragment = new OrderFragment();
                break;
            case R.id.menu_reccuringcart:
                fragment = new RecurringCartFragment();
                break;
            case R.id.menu_landingprofile:
                userProfile =userProfileDetails();
                fragment = new UserProfileFragment();

                Bundle b = new Bundle();
                b.putSerializable(StringConstants.USERPROFILE, userProfile);
                fragment.setArguments(b);
                break;
        }
        if(fragment!=null){
            displayFragment(fragment);
        }

        return false;
    }

    private UserProfile userProfileDetails() {


        Call<UserProfile> call = RetrofitClient.getInstance().getApi().getUserDetails("Bearer "+ user.get(SessionManager.KEY_SESSION_TOKEN));
        Log.i("user :: " , "Bearer "+ user.get(SessionManager.KEY_SESSION_TOKEN));

        call.enqueue(new Callback<UserProfile>(){

            @Override
            public void onResponse(Call<UserProfile> call, Response<UserProfile> response) {
                if(response.isSuccessful()){
                    userProfile = response.body();
                    Log.i("Response SuccessFul :: ", userProfile.getPhoneNo());
                }else {
                    userProfile = response.body();
                    Log.i("Response Failure :: ", userProfile.getPhoneNo());
                    try {

                        Log.e("Coming Inside", String.valueOf(response.code()) + " Err Body " + response.errorBody());
                        Log.i("user :: ", userProfile.getPhoneNo());
                    } catch (Exception e) {
                        Log.e("Error Inside", String.valueOf(response.code()) + " Err Body " + response.errorBody());
                    }
                }
            }

            @Override
            public void onFailure(Call<UserProfile> call, Throwable t) {
                Log.e("Issues ", t.getMessage() );
            }
        });


        return userProfile;
    }

    private void displayFragment(Fragment fragment){

        getSupportFragmentManager().beginTransaction()
                .replace(R.id.landingrelativeLayout, fragment)
                .commit();

        Toast.makeText(LandingActivity.this, "Display Fragment Home", Toast.LENGTH_LONG).show();
    }

1 Ответ

0 голосов
/ 09 января 2019

Ваш модифицированный интерфейс API запущен в потоке.

Примечание: - Таким образом, вы получите userProfile null каждый раз. Потому что этот метод вернитесь, прежде чем ваш API будет выполнен.

Вы все работаете внутри onResponse() метода и делаете его подписью void.

 private void userProfileDetails() {


    Call<UserProfile> call = RetrofitClient.getInstance().getApi().getUserDetails("Bearer "+ user.get(SessionManager.KEY_SESSION_TOKEN));
    Log.i("user :: " , "Bearer "+ user.get(SessionManager.KEY_SESSION_TOKEN));

    call.enqueue(new Callback<UserProfile>(){

        @Override
        public void onResponse(Call<UserProfile> call, Response<UserProfile> response) {
            if(response.isSuccessful()){
                userProfile = response.body();
                Log.i("Response SuccessFul :: ", userProfile.getPhoneNo());
                // Do your post operation here or after this
            fragment = new UserProfileFragment();

            Bundle b = new Bundle();
            b.putSerializable(StringConstants.USERPROFILE, userProfile);
            fragment.setArguments(b);
            getSupportFragmentManager().beginTransaction()
            .replace(R.id.landingrelativeLayout, fragment)
            .commit();

            }else {
                userProfile = response.body();
                Log.i("Response Failure :: ", userProfile.getPhoneNo());
                try {

                    Log.e("Coming Inside", String.valueOf(response.code()) + " Err Body " + response.errorBody());
                    Log.i("user :: ", userProfile.getPhoneNo());
                } catch (Exception e) {
                    Log.e("Error Inside", String.valueOf(response.code()) + " Err Body " + response.errorBody());
                }
            }
        }

        @Override
        public void onFailure(Call<UserProfile> call, Throwable t) {
            Log.e("Issues ", t.getMessage() );
        }
    }); 
}

вызовите ваш метод следующим образом .....

case R.id.menu_landingprofile:
 userProfileDetails();
break;
...