Я сталкиваюсь с проблемой, когда пытаюсь изменить ответ 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;
}
}