В реализации много неправильного.
Прежде всего, result.favDoa().getFavPark().getValue()
всегда будет возвращать ноль, потому что LiveData
является асинхронным. LiveData
предназначено для наблюдения.
Также способ, которым вы используете RxJava
, кажется неправильным. Вы не выполняете никакой реальной работы асинхронно. Эта реализация может быть написана без использования RxJava
.
Также обратите внимание, что не существует простого способа использовать LiveData
AND RxJava
вместе, потому что они не являются взаимозаменяемыми. Людям нравится идти либо «полный LiveData
», «полный RxJava
», либо «RxJava
, пока компоненты пользовательского интерфейса не переключатся на LiveData
.
Есть много разных способов решить эту проблему. Один из вариантов - полностью изменить вашу реализацию на RxJava. (В номере есть поддержка RxJava: https://developer.android.com/topic/libraries/architecture/adding-components#room)
ДАО:
@Dao
public interface FavDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
void save(FavParkEntity park);
@Query("SELECT * FROM favorites")
Single<List<FavParkEntity>> getFavPark(); // Switch to RxJava
@Query("DELETE FROM favorites")
void clearTable();
}
Ваш главный код:
@Override
protected void onHandleIntent(@Nullable Intent intent) {
if (intent == null || intent.getAction() == null) return;
if (intent.getAction().equals(UPDATE_WIDGET)) {
Context context = getApplicationContext();
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this);
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(this, ParkWidgetProvider.class));
FavDatabase.getInstance(context).favDoa().getFavPark() // Access database here.
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(favParkEntityList -> {
// Put your mainThread works here.
if (favParkEntityList != null) {
if (favParkEntityList.size() == 1) {
FavParkEntity favParkEntity = favParkEntityList.get(0);
latLong = favParkEntity.getLatLong();
parkCode = favParkEntity.getParkCode();
imgUrl = favParkEntity.getImage();
title = favParkEntity.getPark_name();
Log.e(TAG, "onHandleIntent: HERE: " + title);
...
} else {
Log.e(TAG, "onHandleIntent: HERE SIZE");
}
} else {
Log.e(TAG, "onHandleIntent: HERE NULL");
}
});
}
}
При желании, если вы не можете переключить свой Dao с LiveData
на RxJava
, вы можете создать синхронную версию getFavPark()
.
ДАО:
@Dao
public interface FavDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
void save(FavParkEntity park);
@Query("SELECT * FROM favorites")
LiveData<List<FavParkEntity>> getFavPark();
@Query("SELECT * FROM favorites")
List<FavParkEntity> getFavParkSync(); // Synchronous access
@Query("DELETE FROM favorites")
void clearTable();
}
Ваш главный код:
@Override
protected void onHandleIntent(@Nullable Intent intent) {
if (intent == null || intent.getAction() == null) return;
if (intent.getAction().equals(UPDATE_WIDGET)) {
Context context = getApplicationContext();
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this);
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(this, ParkWidgetProvider.class));
Observable.fromCallable(() -> {
// fromCallable and subscribeOn will make
// below code run in a worker thread asynchronously.
return FavDatabase.getInstance(context).favDoa().getFavParkSync();
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(favParkEntityList -> {
// Put your mainThread works here.
if (favParkEntityList != null) {
if (favParkEntityList.size() == 1) {
FavParkEntity favParkEntity = favParkEntityList.get(0);
latLong = favParkEntity.getLatLong();
parkCode = favParkEntity.getParkCode();
imgUrl = favParkEntity.getImage();
title = favParkEntity.getPark_name();
Log.e(TAG, "onHandleIntent: HERE: " + title);
...
} else {
Log.e(TAG, "onHandleIntent: HERE SIZE");
}
} else {
Log.e(TAG, "onHandleIntent: HERE NULL");
}
});
}
}