2013-05-23 3 views
-1

Я пытаюсь создать действие, которое позволяет пользователю войти в систему, проверив имя пользователя и пароль из базы данных, однако после того, как скейденсы будут извлечены успешно, 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(). Вы только что определили один, который не будет вызван. Попробуйте использовать auto-complete для onPostExecute. –

ответ

1

Первое, что я вижу, что вы говорите onPostExecute() принять String в своем классе заголовок

class Login extends AsyncTask<String, String, String> 

но ничего или прохождение не принимает что-нибудь к нему

protected void onPostExecute() { 

если вы не хотите p Ass это ничего затем изменить его

class Login extends AsyncTask<Void, Void, Void> 

и

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

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

Обратите внимание, в этом разделе в Docs

трех типов, используемых асинхронной задачи являются следующие:

Params, тип параметров, отправленных заданию ex ex ecution.

Прогресс, тип единиц измерения, опубликованных во время вычисления фона .

Результаты, тип результата вычисления .

Не все типы всегда используются асинхронной задачей. Для того, чтобы пометить тип как неиспользуемые, просто использовать тип Пустоты:

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

'onPostExecute' будет вызываться независимо от того, какие типы параметров ... правильные? –

+0

@AlexLockwood не, если параметры не совпадают с тем, что находится в заголовке класса и в заголовках методов ... Я не верю. Если он вызван, тогда будут ошибки/исключения – codeMagic

+0

@AlexLockwood Если вы не переопределяете метод onPostExecute класса AsyncTask, тогда вы просто создаете экземпляр его самостоятельно, который не будет вызван. Это то, что он пытается указать как возможную ошибку. –

1

Изменение

protected void onPostExecute() 

в

protected void onPostExecute(String result) 

, и вы должны быть золотыми. Подумайте о добавлении в свой код @Override, чтобы предотвратить эти тонкие ошибки в будущем.

Смежные вопросы