Java Android AsyncTask保持返回相反的值
我在Android Studio的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
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类中测试结果
将逻辑添加到AsyncTaskonPostExecute()
:
因为您不能从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) {
}