不明白为啥 AsyncTask 给了我一个不兼容的类型

Posted

技术标签:

【中文标题】不明白为啥 AsyncTask 给了我一个不兼容的类型【英文标题】: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);

【问题讨论】:

你误解了它的用法,请看***.com/questions/9671546/asynctask-android-example 【参考方案1】:

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

【讨论】:

以上是关于不明白为啥 AsyncTask 给了我一个不兼容的类型的主要内容,如果未能解决你的问题,请参考以下文章

创建了我自己的二进制搜索版本,不明白为啥它比常规方法更快?

不推荐使用的导入 android.os.AsyncTask 的代码 [重复]

返回类型与 Asynctask 不兼容

功能运行太慢...我不明白为啥

为啥 AsyncTask 不适合长时间运行的操作

为啥Android的AsyncTask不适合执行长时间操作的任务