首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >怎么判断asynctask线程执行结束?

怎么判断asynctask线程执行结束?

提问于 2020-04-10 14:28:36
回答 0关注 0查看 574

我的构思是:首先,我将对数据进行的操作都放在一个UserRespository类里面,定义asynctask为内部类,进行查询数据库,并返回查询结果的操作;

其次,在通过函数public User findUser(){}里面,调用定义的asynctaskf类;

然后,其他类可以d通过new一个UserRespository类,去访问gfindUser()方法,获得返回结果;

但是,结果却是,在重写的接口中可以拿到取出来的结果,并赋值给定义的局部变量aUser,但将aUser返回的时候,却是null的。

我想,是不是可能是没等到异步线程执行结束,主线程就往下执行,才出现的这样的情况。

大家帮我看看吧!

代码语言:javascript
复制
package com.example.qiongju_1.Repository;

import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;

import com.example.qiongju_1.Dao.UserDao;
import com.example.qiongju_1.Database.MyDatabase;
import com.example.qiongju_1.entity.User;

public class UserRepository {

    public User aUser;
    private User bUser;
    private UserDao userDao;
    //声明另一个全局变量,获取用户的状态


    public UserRepository(){}
    public UserRepository(Context context) {
        MyDatabase myDatabase = MyDatabase.getDatabase(context.getApplicationContext());
        userDao = myDatabase.getUserDao();
    }
    //外访问数据库操作接口
    public void inserUser(User...users){
        new InsertUserAsyncTask(userDao).execute(users[0]);
    }

    public User findUser(String...strings){

        QueryUserAsyncTask queryUserAsyncTask = new QueryUserAsyncTask(userDao);
        queryUserAsyncTask.execute(strings);
        queryUserAsyncTask.setListener(new QueryUserAsyncTask.OnResponseListener<User>(){
            @Override
            public void onResponse(User user) {
                //回调获得数据
                aUser = user;

                //aUser这里可以正常被赋值
                if (aUser != null){
                    Log.d("CF","在Repository.fingUser().listener方法里:"+aUser.getUserAccount());
                }else{
                    Log.d("CF","在Repository.fingUser().listener方法里:用户为空");
                }
            }
        });


        //aUser在这里就是null的
        if (aUser != null){
            Log.d("CF","在Repository.fingUser()方法里:"+aUser.getUserAccount());
        }else{
            Log.d("CF","在Repository.fingUser()方法里:用户为空");
        }

        return aUser;
    }

    //单例模式的类要声明static, 后台执行数据库操作
    //插入用户
    static class InsertUserAsyncTask extends AsyncTask<User,Void,Void> {
        private UserDao userDao;
        public InsertUserAsyncTask(UserDao userDao) {
            this.userDao = userDao;
        }
        @Override
        protected Void doInBackground(User...users) {
            userDao.insertUser(users[0]);
            return null;
        }
    }
//    根据账号查找用户
    static class QueryUserAsyncTask extends AsyncTask<String,Void,User>{
        private UserDao userDao;
        public User user;
        private OnResponseListener<User> listener;

        public QueryUserAsyncTask(UserDao userDao) {
            this.userDao = userDao;
        }
        public void setListener(OnResponseListener<User> listener){
            this.listener = listener;
        }
        @Override
        protected User doInBackground(String... strings) {
            return userDao.findUserByAccount(strings[0]);
        }
        @Override
        protected void onPostExecute(User user) {
            super.onPostExecute(user);
            if(listener!=null){
                //调用接口方法,返回结果
                listener.onResponse(user);
            }
        }
        //接口,类似一个监听事件
        public interface OnResponseListener<T>{
            void onResponse(T t);
        }
    }
}

回答

和开发者交流更多问题细节吧,去 写回答
相关文章

相似问题

相关问答用户
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档