Java AsyncTask不会更改其他变量的值
我正在制作一个android应用程序,它使用jdbc连接到数据库,jdbc需要异步任务,我读了一篇关于它的教程,但是,我有各种各样的麻烦 代码:Java AsyncTask不会更改其他变量的值,java,android,multithreading,jdbc,android-asynctask,Java,Android,Multithreading,Jdbc,Android Asynctask,我正在制作一个android应用程序,它使用jdbc连接到数据库,jdbc需要异步任务,我读了一篇关于它的教程,但是,我有各种各样的麻烦 代码: // login stuff Button Login; EditText Username, Password; String db_username, db_password; // database variables Database d; ResultSet rs; Statement stmt; @Override protected
// login stuff
Button Login;
EditText Username, Password;
String db_username, db_password;
// database variables
Database d;
ResultSet rs;
Statement stmt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
getActionBar().hide();
// defining stuff
Login = (Button) findViewById(R.id.login);
Username = (EditText) findViewById(R.id.username);
Password = (EditText) findViewById(R.id.password);
db_password = "-1";
// focus on the enter username
Username.requestFocus();
Login.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// checking for the password and stuff
Con deploy = new Con();
deploy.execute();
// waiting until data is back
while (db_password.equals("-1")){
}
// checking the entered password
if (db_password.equals(Password.getText())) {
Intent i = new Intent(Login.this, Manager.class);
i.putExtra("name", db_username);
startActivity(i);
finish();
}
}
});
}
// connection class
private class Con extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
d = new Database();
d.connect();
try {
// putting the username and pass in the result set
stmt = d.createStatement();
rs = stmt
.executeQuery("SELECT username,password from users WHERE username='"
+ Username.getText() + "'");
} catch (Exception e) {
}
return null;
}
@Override
protected void onPostExecute(Void result) {
try {
if (rs.next()) {
db_username = rs.getString("username");
db_password = rs.getString("password");
System.out.println("check point");
System.out.println(db_password);
db_password = "0";
} else {
Username.setText("");
Password.setText("");
db_password = "0";
}
} catch (java.sql.SQLException e) {
e.printStackTrace();
}
super.onPostExecute(result);
}
}
私有类Con扩展异步任务{
@凌驾
受保护的结果集doInBackground(无效…参数){
d=新数据库();
d、 connect();
结果集rs;
试一试{
//将用户名和密码放入结果集中
语句stmt=d.createStatement();
rs=stmt
.executeQuery(“从用户名=”的用户中选择用户名和密码”
+Username.getText()+“'”);
}捕获(例外e){
return new ResultSet();//取决于出错时要执行的操作
}
返回rs;
}
@凌驾
受保护的void onPostExecute(结果集结果){
super.onPostExecute(结果);
试一试{
if(result.next()){
db_username=result.getString(“用户名”);
db_password=result.getString(“密码”);
System.out.println(“检查点”);
System.out.println(db_密码);
//db_password=“0”;这总是在一天结束时使其为零
}否则{
Username.setText(“”);
Password.setText(“”);
db_password=“0”;
}
}catch(java.sql.sqle){
e、 printStackTrace();
}
}
编辑如果(db_password.equals(password.getText().toString()){它在onclick侦听器中,也更改此
使用此asnyc ayt..检查结束标记和内容..私有类任务{
@凌驾
受保护的结果集doInBackground(无效…参数){
d=新数据库();
d、 connect();
结果集rs;
试一试{
//将用户名和密码放入结果集中
语句stmt=d.createStatement();
rs=stmt
.executeQuery(“从用户名=”的用户中选择用户名和密码”
+Username.getText()+“'”);
}捕获(例外e){
return new ResultSet();//取决于出错时要执行的操作
}
返回rs;
}
@凌驾
受保护的void onPostExecute(结果集结果){
super.onPostExecute(结果);
试一试{
if(result.next()){
db_username=result.getString(“用户名”);
db_password=result.getString(“密码”);
System.out.println(“检查点”);
System.out.println(db_密码);
//db_password=“0”;这总是在一天结束时使其为零
}否则{
Username.setText(“”);
Password.setText(“”);
db_password=“0”;
}
}catch(java.sql.sqle){
e、 printStackTrace();
}
}
编辑如果(db_password.equals(password.getText().toString()){
它在onclick侦听器中,也更改此
使用此asnyc ayt..检查结束标记和其他东西..如何使它们成为易变的
?可能还需要指出的是,如果在异步任务完成之前阻止它,它会在某种程度上破坏异步任务的点。为什么不尝试在外部类中定义一个回调方法,当它完成时,异步任务
调用该方法,ra而不是等待变量更改?真的吗?先生?。将值返回到onpostexecute代码,这样做有点危险。如果数据库中出现任何错误或获取结果,则while从不停止,UI只是冻结。将其删除,并从onpostexecute调用具有startActivity的方法,然后只需调用来自按钮的click listener方法的异步任务。也不要只捕获异常而不打印任何内容,甚至不打印错误消息。将一些内容放在那里,这样您就可以确保查询数据库时没有错误。@androidpotato7非常感谢您,这很管用,让它们变得不稳定怎么样?这可能也是值得的指出如果阻止异步任务直到它完成,它会在某种程度上破坏异步任务的意义。为什么不尝试在外部类中定义一个回调方法,当AsyncTask
完成时调用该方法,而不是等待变量更改?真的吗?先生?。将您的值返回到您正在执行的onpostexecute代码ng有点危险。如果数据库中出现任何错误或获取结果,则while从不停止,UI只是冻结。将其删除,然后从onPostExecute调用具有startActivity的方法,然后从按钮的click listener方法调用异步任务。另外,不要只捕获异常而不打印任何内容,即使是错误消息。在那里放一些东西,这样你就可以确保查询数据库时没有错误。@androidpotato7非常感谢,这很有效。为什么这样做可以解决问题?最好这样做,但我不知道它怎么可能解决他的问题。我不知道为什么,但它不会改变上面变量的值,有什么吗还有什么可以替代AsyncTask的吗?@AbdullahAsendar执行System.out.println(db_password);
打印出新值?如果是,那么asnyc任务检查结果良好,那么继续比较字符串,好吗?。也检查编辑后的答案…(如果第一条语句为真)@androidpotato7为什么?好吧,请注意,先生,但我看不出它如何解决他的问题,你必须拭目以待。好的,一切都很好,我设法解决了问题,但比较了两个字符串Password.getText().equals(db_Password);始终返回false,尝试在控制台中打印两个变量,它们相同,但仍然返回false,然后我将单击侦听器放在AsyncTask类中,但它不会启动其他活动,,,我是第一次使用AsyncTask,所以可能我做错了什么,非常感谢@elltz为什么这会解决问题?这样做比较好,但我不喜欢
new Thread(new Runnable() {
public void run() {
}).start();
private class Con extends AsyncTask<Void, Void, ResultSet > {
@Override
protected ResultSet doInBackground(Void... params) {
d = new Database();
d.connect();
ResultSet rs;
try {
// putting the username and pass in the result set
Statement stmt = d.createStatement();
rs = stmt
.executeQuery("SELECT username,password from users WHERE username='"
+ Username.getText() + "'");
} catch (Exception e) {
return new ResultSet(); // depends on what you want to do on error
}
return rs;
}
@Override
protected void onPostExecute(ResultSet result) {
super.onPostExecute(result);
try {
if (result.next()) {
db_username = result.getString("username");
db_password = result.getString("password");
System.out.println("check point");
System.out.println(db_password);
// db_password = "0"; this always makes it zero at the end of the day
} else {
Username.setText("");
Password.setText("");
db_password = "0";
}
} catch (java.sql.SQLException e) {
e.printStackTrace();
}
}