2013-05-23 2 views
-1

사용자가 데이터베이스에서 사용자 이름과 암호를 확인하여 로그인 할 수있는 활동을 만들려고하지만, creadentials를 성공적으로 가져온 후에 doInbackground가 실행을 멈추지 않습니다. 잘 모르겠습니다. onpostexecute를 실행하기 위해 내가 할 수있는 일. 여기에 코드onPostExecute()가 AsyncTask에서 실행되지 않음

public class LoginActivity extends Activity{ 

public String username; 
public String password; 
public String userid; 
JSONParser jParser = new JSONParser(); 
JSONObject json; 
Context context; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    context=getApplicationContext(); 
    setContentView(R.layout.activity_login); 



    Button loginbutton=(Button) findViewById(R.id.loginbutton); 

    final EditText usernameText=(EditText) findViewById(R.id.usernameInput); 
    final EditText passwordText=(EditText) findViewById(R.id.passwordInput); 

    loginbutton.setOnClickListener(new OnClickListener() { 


     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      username=usernameText.getText().toString(); 
      password=passwordText.getText().toString(); 

      if(username.trim().length()==0 || password.trim().length()==0){ 
       AlertDialogManager diag=new AlertDialogManager(); 
       diag.showAlertDialog(getApplicationContext(), "Fill Fields", "enter a username and password", false); 


      }else{ 
       //send the username and password for verification 
       new Login().execute(); 

      } 


     } 
    }); 


} 
//http class starts here. 
class Login extends AsyncTask<String, String, String> { 
    InputStream is = null; 
    JSONObject jObj = null; 
    ProgressDialog pDialog; 
    static final String url = "http://10.0.2.2/newptk/dalvik/auth.php"; 

    protected void onPreExecute() { 
     super.onPreExecute(); 
     pDialog = new ProgressDialog(LoginActivity.this); 
     pDialog.setMessage("Authenticating..."); 
     pDialog.setIndeterminate(false); 
     pDialog.setCancelable(true); 
     pDialog.show(); 
    } 

    @Override 
    protected String doInBackground(String... arg0) { 
     // TODO Auto-generated method stub 
     Log.e("Auth", "working"); 
     JSONArray document = null; 
     List<NameValuePair> params = new ArrayList<NameValuePair>(); 
     params.add(new BasicNameValuePair("username", username)); 
     params.add(new BasicNameValuePair("password", password)); 

     json = jParser.makeHttpRequest(url, "POST", params); 

     return null; 
    } 

    protected void onPostExecute() { 
     pDialog.dismiss(); 
     SessionManager smg=new SessionManager(getApplicationContext()); 

     int flag = 0; 
     try { 
      flag = json.getInt("success"); 

      if(flag==1){ 
       userid=json.getString("userid"); 
       //set the session 
       smg.createLoginSession(username, userid); 
       //Login the user 
       Intent i = new Intent(getApplicationContext(), ReportFound.class); 
       startActivity(i); 
       finish(); 

      }else{ 
       AlertDialogManager diag=new AlertDialogManager(); 
       diag.showAlertDialog(LoginActivity.this, "Login", "Incorrect Username/password", false); 
      } 



     } catch (JSONException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 


    } 

}//end of http class 

}

+1

코드를 디버깅하여 doInBackground가 중지 된 곳을 확인해 보셨습니까? – Christine

+0

해당 onPostExecute()를 재정의하는 것처럼 보이지 않습니다. 방금 호출하지 않을 자신을 정의했습니다. onPostExecute에 자동 완성 기능을 사용해보십시오. –

답변

1

내가 볼 첫 번째 것은 당신이 당신의 클래스 헤더

class Login extends AsyncTask<String, String, String> 

String을 받아 onPostExecute()을 말하고있다 아무것도하지만, 또는 통과를 허용하지 않는 것입니다이다 무엇이든간에

protected void onPostExecute() { 

p 그것은 아무것도 후 비동기 작업에서 사용하는 Docs

세 가지 유형에

class Login extends AsyncTask<Void, Void, Void> 

protected void onPostExecute(Void result) { 
... 
} 

@Override 
protected void doInBackground(String... arg0) { 

공지 사항이 섹션으로 변경 엉덩이 다음과 같습니다

예를 들어 작업에 전송 된 매개 변수의 유형 인 Params 생태.

진행률, 백그라운드 계산 중에 게시 된 진행률 단위의 유형입니다.

결과, 백그라운드 계산 결과의 유형.

모든 유형이 항상 비동기 작업에서 사용되는 것은 아닙니다.

protected void onPostExecute(String result) 

private class MyTask extends AsyncTask<Void, Void, Void> { ... } 
+0

'onPostExecute'는 매개 변수 유형이 ... 정확하더라도 상관없이 호출됩니다. –

+0

@AlexLockwood 매개 변수가 클래스 머리글과 메서드 헤더에있는 내용과 일치하지 않으면 ... 나는 믿을 수 없습니다. 호출 된 경우 오류/예외가 발생합니다. – codeMagic

+0

@AlexLockwood AsyncTask 클래스의 onPostExecute 메서드를 재정의하지 않으면 호출되지 않을 인스턴스를 직접 작성하는 것입니다. 가능한 오류로 지적하려고 시도한 것입니다. –

1

변경

protected void onPostExecute() 

당신은 황금해야한다 : 사용하지 않는 등의 유형을 표시하려면 유형의 무효를 사용합니다. 나중에 이러한 미묘한 버그를 방지하려면 코드에 @Override 태그를 추가하는 것이 좋습니다.

관련 문제