不明白为什么AsyncTask给我一个不兼容的类型

时间:2018-11-12 19:41:36

标签: android multithreading android-studio asynchronous android-asynctask

我正在尝试在后台访问我的数据库,以便不锁定线程并收到错误,因此我读到我应该使用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);

}

1 个答案:

答案 0 :(得分:1)

AsyncTask的execute()方法返回void,而您正在尝试从声明为返回Step的方法中返回void。最好是从getStepById()方法中获取AsyncTask,而在调用getStepById()的地方使用AsyncTask。我认为您假设execute()阻塞,直到任务完成,这是不正确的。如果真是这样,那就没有必要使用AsyncTask了。 execute()立即返回,onPostExecute(Step step)是处理/显示/无论结果如何的地方。