到处都有相同的信息,长时间的操作需要在与UI线程不同的其他线程中运行,例如-使用数据库进行操作。
...这是真的,如果我尝试将某些内容保存到数据库中,我会得到:
无法访问主线程上的数据库,因为它可能 长时间锁定用户界面。
这是我的问题,为什么我可以从UI中从数据库中获取所有数据? :)
(我的数据库没有.allowMainThreadQueries()
“
这是Google文档中经过一些修改的代码:
ViewModel:
public class LocationsViewModel extends AndroidViewModel {
private LocationRepository locationRepository;
private LiveData<List<LocationModel>> allLocationsLiveData;
public LiveData<List<LocationModel>> getAllLocationsLiveData() {
return allLocationsLiveData;
}
public LocationsViewModel(@NonNull Application application) {
super(application);
locationRepository = new LocationRepository(application);
allLocationsLiveData = locationRepository.getAllLocation();
}
}
存储库:
public class LocationRepository {
private final LocationDao locationDao;
private LiveData<List<LocationModel>> allLocation;
LiveData<List<LocationModel>> getAllLocation() {
return allLocation;
}
LocationRepository(Application application){
LocationsDatabase db = LocationsDatabase.getDatabase(application);
locationDao = db.locationDao();
allLocation = locationDao.getAllLocations();
}
}
片段中的init方法:
private void initData() {
locationsViewModel = ViewModelProviders.of(this).get(LocationsViewModel.class);
locationsViewModel.getAllLocationsLiveData().observe(this, new Observer<List<LocationModel>>() {
@Override
public void onChanged(@Nullable List<LocationModel> locations) {
mAdapter.setLocationList(locations);
}
});
}
道:
@Dao
public interface LocationDao {
@Insert(onConflict = OnConflictStrategy.IGNORE)
void insert(LocationModel... locations);
@Query("SELECT * FROM LocationModel")
LiveData<List<LocationModel>> getAllLocations();
}
那么为什么我可以从UI中获取FromFromDatabse,但是需要其他线程进行保存?
答案 0 :(得分:2)
您使用LiveData,它实际上是在后台线程上运行。
它不会同步发生,因此它不会在主线程上发生。
您订阅更改,这些更改是在后台线程上计算的,然后仅在主线程上提供给您的“活动/片段”。
当您尝试保存某些内容时,您不会使用LiveData(您也不应该使用LiveData,因此一切都很好),因此它在主线程上运行。不应该的。
因此,您需要在新线程中运行它,创建AsyncTask或类似的程序。