2013-02-21 27 views
5

Sto tentando di inviare una richiesta a un server a uno script php che verificherà se un utente esiste in un database. Attualmente voglio solo assicurarmi di ricevere una sorta di risposta. Provo a generare il valore di responseString quando l'utente preme il pulsante di accesso ma ogni volta che torna come null. Qualcuno sa perché ??Risposta null dalla richiesta HTTP HTTP

Questo è il mio MainActivity

public class MainActivity extends Activity { 

EditText username; 
EditText password; 
Button loginBtn; 
LinearLayout loginform; 
String passwordDetail; 
String usernameDetail; 
String url = "http://www.mysite.com/example/checklogin.php"; 

String responseString = null; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    //Hide the Action Bar 
    ActionBar ab; 
    ab = this.getActionBar(); 
    ab.hide(); 

    //Get references to XML 
    username = (EditText)findViewById(R.id.username); 
    password = (EditText)findViewById(R.id.password); 
    loginBtn = (Button)findViewById(R.id.loginBtn); 
    loginform = (LinearLayout)findViewById(R.id.loginform); 

    //Animation 
    final AlphaAnimation fadeIn = new AlphaAnimation(0.0f , 1.0f); 
    AlphaAnimation fadeOut = new AlphaAnimation(1.0f , 0.0f) ; 
    fadeIn.setDuration(1200); 
    fadeIn.setFillAfter(true); 
    fadeOut.setDuration(1200); 
    fadeOut.setFillAfter(true); 
    fadeOut.setStartOffset(4200+fadeIn.getStartOffset()); 

    //Run thread after 2 seconds to start Animation 
    Handler handler = new Handler(); 
    handler.postDelayed(new Runnable(){ 

     public void run() { 
      //display login form 
      loginform.startAnimation(fadeIn); 
      loginBtn.setOnClickListener(new View.OnClickListener() { 
       public void onClick(View v) { 
        //display(); 
        Toast.makeText(getApplicationContext(), "Checking login details...", Toast.LENGTH_SHORT).show(); 
        if(checkLoginDetails()){ 
         //OPENS NEW ACTIVITY 
         //Close splash screen 
         //finish(); 
         //start home screen 
         Intent intent = new Intent(v.getContext(), SectionsActivity.class); 
         //startActivity(intent); 
         //creates fade in animation between two activities 
         overridePendingTransition(R.anim.fade_in, R.anim.splash_fade_out); 
         Toast.makeText(getApplicationContext(), "Login Successful" + responseString, Toast.LENGTH_SHORT).show(); 

        } 
        else{ 
         Toast.makeText(getApplicationContext(), "Login Unsuccessful", Toast.LENGTH_SHORT).show(); 

        } 
       } 
      }); 

     } 

    }, 2000); 
} 

//Check the login details before proceeding. 
public boolean checkLoginDetails(){ 
    usernameDetail = username.getText().toString(); 
    passwordDetail = password.getText().toString(); 
    new RequestTask().execute(url, usernameDetail, passwordDetail); 
    return true; 
} 

Questo è lo script php che sto chiedendo - Al momento ho hard coded dettagli so di esistere in dB e vogliono solo concentrarsi su come ottenere di nuovo una risposta alla dì che l'utente esiste.

<?php 
mysql_connect("xxx.xxx.xxx.xxx", "username", "password") or die("Couldn't select database."); 
mysql_select_db("databasename") or die("Couldn't select database."); 

//$username = $_POST['username']; 
//$password = $_POST['password']; 

$pwdMD5 = md5(123); 

$sql = "SELECT * FROM membership WHERE Username = 'user1' AND Password = '$pwdMD5' "; 
$result = mysql_query($sql) or die(mysql_error()); 
$numrows = mysql_num_rows($result); 
if($numrows > 0) 
    { 
    echo 'user found'; 
    return true; 
    } 
else 
    { 
    echo 'user not found'; 
    return false; 

} 
    ?> 

Questo è il mio AsyncTask.

class RequestTask extends AsyncTask<String, String, String>{ 

    @Override 
    protected String doInBackground(String... uri) { 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpResponse response; 
     responseString = null; 
     try { 
      response = httpclient.execute(new HttpPost(uri[0])); 
      StatusLine statusLine = response.getStatusLine(); 
      if(statusLine.getStatusCode() == HttpStatus.SC_OK){ 
       ByteArrayOutputStream out = new ByteArrayOutputStream(); 
       response.getEntity().writeTo(out); 
       out.close(); 
       responseString = out.toString(); 
      } else{ 
       //Closes the connection. 
       response.getEntity().getContent().close(); 
       throw new IOException(statusLine.getReasonPhrase()); 
      } 
     } catch (ClientProtocolException e) { 
      //TODO Handle problems.. 
     } catch (IOException e) { 
      //TODO Handle problems.. 
     } 
     return responseString; 
    } 
+0

è possibile assegnare che 'responseString' prima di chiamare' out.close () '?? Fammi sapere se quella stringa è 'null' – Geros

+0

@ system32 Ho fatto come suggerito, restituisce comunque il valore di' null'. L'app non si arrestava mai, restituiva sempre 'null' come valore di' responseString'. – Javacadabra

+0

Metti 'e.printStackTrace()' nei tuoi blocchi 'catch' e posta lo stacktrace. Potrebbe aiutare. – Geros

risposta

8

È null perché si esegue il codice in modo asincrono. Tostate il risultato mentre la richiesta HTTP non è ancora terminata eseguendo lo script PHP.

Prova a mettere il tuo Toast al metodo onPostExecute (String result) nella classe AsyncTask.

@Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     //Toast result. 
    } 
+0

Grazie, ha fatto il lavoro! – Javacadabra

0

non si ottiene qualcosa dal respose ma mettendo in esso ... usare ByteArrayInputStream invece di flusso di uscita .....