Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android AsyncTask保持返回相反的值_Java_Android_Android Asynctask - Fatal编程技术网

Java Android AsyncTask保持返回相反的值

Java Android AsyncTask保持返回相反的值,java,android,android-asynctask,Java,Android,Android Asynctask,我在Android Studio的AsyncTask中遇到问题。我要做的是在创建新用户之前,检查我的数据库中是否存在用户名和电子邮件。以下是我调用创建异步任务的部分: new SignupAsyncTask(getBaseContext()).execute(userModel); if(SignupAsyncTask.successCheck == false){ Toast.makeText(getBaseContext(), "Failed", Toast.LENGTH_SHORT

我在Android Studio的AsyncTask中遇到问题。我要做的是在创建新用户之前,检查我的数据库中是否存在用户名和电子邮件。以下是我调用创建异步任务的部分:

new SignupAsyncTask(getBaseContext()).execute(userModel);
if(SignupAsyncTask.successCheck == false){
    Toast.makeText(getBaseContext(), "Failed", Toast.LENGTH_SHORT).show();
} else if(SignupAsyncTask.successCheck == true){
    Toast.makeText(getBaseContext(), "Success", Toast.LENGTH_SHORT).show();
}
public class SignupAsyncTask extends AsyncTask<User, Integer, Boolean> {
  ...

  OnSuccessCheckReceived callBack;
  public SignupAsyncTask(){}

  public SignupAsyncTask(Context context, OnSuccessCheckReceived callBack){
    this.context = context;
    this.callBack = callBack;
  }

  ...

  @Override
  protected void onPostExecute(Boolean result){
    //if(result == false){
    //  // Process if false
    //  callBack.onSuccessCheckReceived(false); // Tell the caller 
    //} else if(result == true){
    //  // Process if true
    //}

    // a more compact code
    callBack.onSuccessCheckReceived(result); // Tell the caller 
  }
在AsyncTask中,我获得了所有用户。然后我执行一个循环来检查是否有任何匹配的用户名或密码。如果有,我将successCheck设置为false

public class SignupAsyncTask extends AsyncTask<User, Integer, Boolean> {
    ArrayList<User> list = new ArrayList<User>();
    DB_User userCtrl = new DB_User();
    Context context;
    public static boolean successCheck = false;

    public SignupAsyncTask(){}

    public SignupAsyncTask(Context context){
        this.context = context;
    }

    @Override
    protected Boolean doInBackground(User... params) {
        try {
            list = userCtrl.getAllUser();
            for(int i = 0; i < list.size(); i++){
                User userObj = list.get(i);
                if(params[0].getUserName().equals(userObj.getUserName())){
                    successCheck = false;
                    break;
                }
                else if (params[0].getEmail().equals(userObj.getEmail())){
                    successCheck = false;
                    break;
                } else{
                    successCheck = true;
                    break;
                }
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

        if(successCheck == true){
            userCtrl.SignupUser(params[0]);
        }
        return successCheck;
    } 

    @Override
    protected void onPostExecute(Double result){

    }

    @Override
    protected void onProgressUpdate(Integer... progress) {

    }
}
公共类SignupAsyncTask扩展了AsyncTask{
ArrayList=新建ArrayList();
DB_User userCtrl=new DB_User();
语境;
公共静态布尔值successCheck=false;
公共注册异步任务(){}
公共注册异步任务(上下文){
this.context=上下文;
}
@凌驾
受保护的布尔doInBackground(用户…参数){
试一试{
list=userCtrl.getAllUser();
对于(int i=0;i
我现在遇到的问题是,当我第一次使用不重复的用户名和电子邮件进行测试时,它可以插入到数据库中,但不知何故,toast打印出了“失败”

然后,当我尝试使用另一个重复记录时,它不会插入到数据库中,因为我将用户名和电子邮件设置为唯一的,但toast会打印出“Success”

它的操作方式与我的代码逻辑相反。有什么想法吗

提前谢谢

编辑

公共类SignupAsyncTask扩展了AsyncTask{
ArrayList=新建ArrayList();
DB_User userCtrl=new DB_User();
语境;
公共静态布尔值successCheck=false;
公共注册异步任务(){}
公共注册异步任务(上下文){
lcontext=上下文;
}
@凌驾
受保护的布尔doInBackground(用户…参数){
试一试{
list=userCtrl.getAllUser();
对于(int i=0;i
将逻辑放入
onPostExecute()

AsyncTask异步执行,即它不在主线程上运行。它生成一个称为工作线程的单独线程,执行其逻辑,然后将结果发回主线程

编辑1 按以下方式更改代码:

public class SignupAsyncTask extends AsyncTask<User, Integer, Boolean> {
    ArrayList<User> list = new ArrayList<User>();
    DB_User userCtrl = new DB_User();
    Context context;
    public static boolean successCheck = false;
    User user = null;

    public SignupAsyncTask(){}

    public SignupAsyncTask(Context context){
        this.context = context;
    }

    @Override
    protected Boolean doInBackground(User... params) {
        try {
            user = params[0];
            list = userCtrl.getAllUser();
            for(int i = 0; i < list.size(); i++){
                User userObj = list.get(i);
                if(user.getUserName().equals(userObj.getUserName())){
                    successCheck = false;
                    break;
                }
                else if (user.getEmail().equals(userObj.getEmail())){
                    successCheck = false;
                    break;
                } else{
                    successCheck = true;
                    break;
                }
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return successCheck;
    } 

    @Override
    protected void onPostExecute(Boolean result){
        if(result){
            Toast.makeText(getBaseContext(), "Success", Toast.LENGTH_SHORT).show();
            //Call SignupUser Code Here...
            if(user != null) {
                userCtrl.SignupUser(user);   
            }
        } else {
            Toast.makeText(getBaseContext(), "Failed", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    protected void onProgressUpdate(Integer... progress) {

    }
}
公共类SignupAsyncTask扩展了AsyncTask{
ArrayList=新建ArrayList();
DB_User userCtrl=new DB_User();
语境;
公共静态布尔值successCheck=false;
User=null;
公共注册异步任务(){}
公共注册异步任务(上下文){
this.context=上下文;
}
@凌驾
受保护的布尔doInBackground(用户…参数){
试一试{
user=params[0];
list=userCtrl.getAllUser();
对于(int i=0;i
这是因为它的名称是一个异步任务。您需要在SignupAsyncTask类中测试结果

将逻辑添加到AsyncTask
onPostExecute()

因为您不能从SignupAsyncTask(您的类不是调用者类的成员类)访问UI线程,所以您需要在调用者类中定义一个接口作为侦听器机制,以便
public class SignupAsyncTask extends AsyncTask<User, Integer, Boolean> {
    ArrayList<User> list = new ArrayList<User>();
    DB_User userCtrl = new DB_User();
    Context context;
    public static boolean successCheck = false;
    User user = null;

    public SignupAsyncTask(){}

    public SignupAsyncTask(Context context){
        this.context = context;
    }

    @Override
    protected Boolean doInBackground(User... params) {
        try {
            user = params[0];
            list = userCtrl.getAllUser();
            for(int i = 0; i < list.size(); i++){
                User userObj = list.get(i);
                if(user.getUserName().equals(userObj.getUserName())){
                    successCheck = false;
                    break;
                }
                else if (user.getEmail().equals(userObj.getEmail())){
                    successCheck = false;
                    break;
                } else{
                    successCheck = true;
                    break;
                }
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return successCheck;
    } 

    @Override
    protected void onPostExecute(Boolean result){
        if(result){
            Toast.makeText(getBaseContext(), "Success", Toast.LENGTH_SHORT).show();
            //Call SignupUser Code Here...
            if(user != null) {
                userCtrl.SignupUser(user);   
            }
        } else {
            Toast.makeText(getBaseContext(), "Failed", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    protected void onProgressUpdate(Integer... progress) {

    }
}
@Override
protected void onPostExecute(Boolean result){
  if(result == false){
    // Process if false
  } else if(result == true){
    // Process if true
  }
}
public interface OnSuccessCheckReceived{
  void onSuccessCheckReceived(boolean isSuccess);
}
public class SignupAsyncTask extends AsyncTask<User, Integer, Boolean> {
  ...

  OnSuccessCheckReceived callBack;
  public SignupAsyncTask(){}

  public SignupAsyncTask(Context context, OnSuccessCheckReceived callBack){
    this.context = context;
    this.callBack = callBack;
  }

  ...

  @Override
  protected void onPostExecute(Boolean result){
    //if(result == false){
    //  // Process if false
    //  callBack.onSuccessCheckReceived(false); // Tell the caller 
    //} else if(result == true){
    //  // Process if true
    //}

    // a more compact code
    callBack.onSuccessCheckReceived(result); // Tell the caller 
  }
public class YourCallerActivity implements OnSuccessCheckReceived {
  ...
  @Override 
  public void onSuccessCheckReceived(boolean isSuccess) {
    if(isSuccess){
        Toast.makeText(getBaseContext(), "Failed", Toast.LENGTH_SHORT).show();
    } else {
        Toast.makeText(getBaseContext(), "Success", Toast.LENGTH_SHORT).show();
    }
  }
  ...
}
// this is pointing to your implemented interface.
new SignupAsyncTask(getBaseContext(), this).execute(userModel); 
public SignupAsyncTask(OnSuccessCheckReceived callBack){
  //this.context = context; Remove this.
  this.callBack = callBack;
}
new SignupAsyncTask(this).execute(userModel);
@Override
protected void onPostExecute(Double result){

}
@Override
protected void onPostExecute(Boolean result){

}
@Override
protected void onPostExecute(Boolean result){
  // This is a more compact code that your previous code.
  callBack.onSuccessCheckReceived(result); // Tell the caller 
}
    private ArrayList<User> list;
        private DB_User userCtrl;
        private Context context;
        private SendResponse mRes;

        public SignupAsyncTask(Context context,SendResponse res){
            this.context = context;
            userCtrl = new DB_User();
            list = new ArrayList<User>();
            mRes = res;
        }

        @Override
        protected Boolean doInBackground(User... params) {
            try {
                list = userCtrl.getAllUser();
                for(User userObj:userCtrl.getAllUser()){
                    if(params[0].getUserName().equals(userObj.getUserName())
                            || params[0].getEmail().equals(userObj.getEmail()))
                       return false;
                }else{
                    userCtrl.SignupUser(params[0]);
                      return true;
}
            } catch (JSONException e) {
                e.printStackTrace();
                return false;
            }
                return true;
        }

        @Override
        protected void onPostExecute(Boolean result){


                //notify through interface to activity or fragment wherever you want to
                //mRes.sendResponse(result);
        }

        @Override
        protected void onProgressUpdate(Integer... progress) {

        }