Mvvm и проблема преобразования switchMap - PullRequest
0 голосов
/ 29 апреля 2020

Я сталкиваюсь с проблемой, когда пытаюсь изменить ответ liveData. Я использую шаблон Mvvm и менеджер репозитория. Кажется, проблема в том, что сетевой запрос является отдельным потоком, но switchMap работает на mainThread. Я хочу преобразовать ответ в MutableList из Boolean (true / false), если город уже найден в бэкэнде.

Давайте начнем с моего исключения NullPointerException.

java.lang.NullPointerException: Attempt to invoke virtual method 'com.example.weatherman.data.model.Data com.example.weatherman.data.model.Example.getData()' on a null object reference
        at com.example.weatherman.ui.tutorial.TutorialViewModel.lambda$new$0$TutorialViewModel(TutorialViewModel.java:27)

Это мой ViewModel


    private NetworkRepository networkRepository;

    private final MutableLiveData<String> cityNameLiveData = new MutableLiveData<>();

    public final LiveData<Boolean> isSupported =
            Transformations.switchMap(cityNameLiveData, cityName -> {
                MutableLiveData<Example> requestResponse = networkRepository.isCitySupported(Constants.KEY, cityName);
                MutableLiveData<Boolean> flag = new MutableLiveData<>(false);
                if (requestResponse.getValue().getData() != null)
                    flag.setValue(true);
                return flag;
            });


    public LiveData<Boolean> getIsSupported() {
        return isSupported;
    }

    public TutorialViewModel(@NonNull Application application) {
        super(application);
        networkRepository = new NetworkRepository(application);
    }

    public void requestForCity(String cityName) {
        cityNameLiveData.setValue(cityName);
    }

}

И, наконец, мой репозиторий

publi c class NetworkRepository {

private ApiRequest apiRequest;
private AppDatabase db;

public NetworkRepository(Application application) {
    //TODO Remove allow on main Thread
    db = Room.databaseBuilder(application, AppDatabase.class, "DBNAME1").allowMainThreadQueries().build();
    this.apiRequest = RetrofitService.getRetrofitInstance().create(ApiRequest.class);
}

public MutableLiveData<Example> isCitySupported(String key, String city) {
    final MutableLiveData<Example> newsData = new MutableLiveData<>();
    apiRequest.getCountry(key, city, "json").enqueue(new Callback<Example>() {
        @Override
        public void onResponse(Call<Example> call, Response<Example> response) {
            if (response.isSuccessful()) {
                newsData.setValue(response.body());

            }
        }

        @Override
        public void onFailure(Call<Example> call, Throwable t) {
            newsData.setValue(null);
        }
    });
    return newsData;
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...