jdbc를 사용하여 데이터베이스에 연결하는 안드로이드 응용 프로그램을 만들고 있습니다. jdbc에 AsyncTask가 필요합니다. 그것에 대한 튜토리얼을 읽었지만 모든 문제가 있습니다!AsyncTask 다른 변수의 값을 변경하지 마십시오
코드 : 내가 생각 테스트 후
// 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);
}
}
이 값의 데이터베이스로 변경하지만, 메인 스레드에서 두 변수가 db_password db_username 스레드 내부에 절대 변경! 내가 대신 AcyncTask이 사용하고 모든 것을 해결 : 내가 정적 그러나 didnt 한 일이,
가 해결 도와주세요 이러한 변수를 만들어
new Thread(new Runnable() {
public void run() {
}).start();
'휘발성'으로 만들면 어떻습니까? –
도 마찬가지입니다. –
완료 될 때까지 차단하면 비동기 작업의 요점을 다소 상실 할 수 있습니다. 'AsyncTask'가 변수가 변경되기를 기다리는 것이 아니라 종료 될 때 호출하는 외부 클래스에서 콜백 메소드를 정의 해보지 않으시겠습니까? –