会议室数据库不需要新线程即可进行长时间的查询操作

时间:2018-11-25 11:46:36

标签: java android multithreading android-room android-jetpack

到处都有相同的信息,长时间的操作需要在与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,但是需要其他线程进行保存?

1 个答案:

答案 0 :(得分:2)

您使用LiveData,它实际上是在后台线程上运行。

它不会同步发生,因此它不会在主线程上发生。

您订阅更改,这些更改是在后台线程上计算的,然后仅在主线程上提供给您的“活动/片段”。

当您尝试保存某些内容时,您不会使用LiveData(您也不应该使用LiveData,因此一切都很好),因此它在主线程上运行。不应该的。
因此,您需要在新线程中运行它,创建AsyncTask或类似的程序。