我正在尝试在后台访问我的数据库,以便不锁定线程并收到错误,因此我读到我应该使用AsyncTask。从我阅读的内容来看,它使用3种数据类型。它接受的数据类型,它处理的数据类型以及返回数据类型。所以我在这里制作了一个步进跟踪器,并希望通过id访问我的数据库,以便我调用存储库并传入我正在使用的数据库和要查找的id
cStep = stepRepository.getStepById(stepDatabase,0);
这是我的存储库类和其中的AsyncTask
> public class StepRepository implements IStepDataSource {
private IStepDataSource mLocalDataSource;
private static StepRepository mInstance;
public StepRepository(IStepDataSource mLocalDataSource) {
this.mLocalDataSource = mLocalDataSource;
}
public static StepRepository getInstance(IStepDataSource mLocalDataSource){
if(mInstance == null)
mInstance = new StepRepository(mLocalDataSource);
return mInstance;
}
@Override
public Flowable<List<Step>> getAllSteps() {
return mLocalDataSource.getAllSteps();
}
@Override
public Step getStepById(StepDatabase db, int userId) {
return new getAsyncTask(db).execute(userId);
}
private static class getAsyncTask extends AsyncTask<Integer, Void, Step> {
getAsyncTask(StepDatabase db) {
this.db = db;
}
@Override
protected Step doInBackground(Integer... params) {
StepDao dao = db.stepDao();
return dao.getStepById(params[0]);
}
@Override
protected void onPostExecute(Step step) {
}
}
@Override
public void insertStep(Step... steps) {
mLocalDataSource.insertStep(steps);
}
@Override
public void updateStep(Step... steps) {
mLocalDataSource.updateStep(steps);
}
@Override
public void deleteStep(Step step) {
mLocalDataSource.deleteStep(step);
}
}
我不明白为什么getUserByid给我不兼容的类型,因为AsyncTask接受并进行整数运算并返回我想要的步骤?
如果有任何帮助,这是我的存储库实现的IStepDataSource
public interface IStepDataSource {
Flowable<List<Step>> getAllSteps();
Step getStepById(StepDatabase db, int userId);
void insertStep(Step... steps);
void updateStep(Step... steps);
void deleteStep(Step step);
}
答案 0 :(得分:1)
AsyncTask的execute()方法返回void,而您正在尝试从声明为返回Step的方法中返回void。最好是从getStepById()方法中获取AsyncTask,而在调用getStepById()的地方使用AsyncTask。我认为您假设execute()阻塞,直到任务完成,这是不正确的。如果真是这样,那就没有必要使用AsyncTask了。 execute()立即返回,onPostExecute(Step step)是处理/显示/无论结果如何的地方。