Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.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 AsyncTask不会更改其他变量的值_Java_Android_Multithreading_Jdbc_Android Asynctask - Fatal编程技术网

Java AsyncTask不会更改其他变量的值

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

我正在制作一个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 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();
    }

}