【问题标题】:Not understanding why AsyncTask is giving me an incompatible type不明白为什么 AsyncTask 给了我一个不兼容的类型
【发布时间】:2019-04-15 13:53:45
【问题描述】:

我试图在后台访问我的数据库,这样我就不会锁定线程并得到一个错误,所以我读到我应该使用 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);

}

【问题讨论】:

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


【解决方案1】:

AsyncTask 的 execute() 方法返回 void,您正试图从声明为返回 Step 的方法返回 void。最好从 getStepById() 方法中取出 AsyncTask,而使用调用 getStepById() 的 AsyncTask。我认为您假设 execute() 阻塞直到任务完成,这是不正确的。如果是这种情况,那么使用 AsyncTask 就没有意义了。 execute() 立即返回,onPostExecute(Step step) 是结果应该被处理/显示/什么的地方。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多