2015-01-25 3 views
2

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(); 
+0

'휘발성'으로 만들면 어떻습니까? –

+0

도 마찬가지입니다. –

+0

완료 될 때까지 차단하면 비동기 작업의 요점을 다소 상실 할 수 있습니다. 'AsyncTask'가 변수가 변경되기를 기다리는 것이 아니라 종료 될 때 호출하는 외부 클래스에서 콜백 메소드를 정의 해보지 않으시겠습니까? –

답변

-1
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(); 
    } 

} 

편집는이 if (db_password.equals(Password.getText().toString())) {의에서 변경을 귀하의 onclick 수신 대기자

사용이 asnyc ayt .. 닫기 태그 및 물건을 확인하십시오.

+0

왜이 문제가 해결 되었습니까? 이런 식으로하는 것이 더 좋지만, 어떻게하면 문제가 해결 될지 알 수 없습니다. – mobilepotato7

+0

왜 그런지 모르지만 위의 변수 값을 변경하지 않으면 AsyncTask 대신 사용할 수있는 것이 있습니까? –

+0

@AbdullahAsendar는 'System.out.println (db_password);'명령을 실행하여 새로운 값을 출력합니까? 그렇다면 당신의 asnyc 작업은 문자열을 비교하는 것으로 옮깁니다. 첫 번째 문장이 참이면 편집 된 대답을 확인하십시오. – Elltz

관련 문제