2013-02-21 23 views
5

Próbuję wysłać do serwera żądanie skryptu php, który sprawdzi, czy użytkownik istnieje w bazie danych. Obecnie chcę tylko upewnić się, że otrzymuję jakąś odpowiedź. Próbuję wyprowadzić wartość responseString, gdy użytkownik naciśnie przycisk logowania, ale za każdym razem, gdy wróci jako null. Czy ktoś wie dlaczego?Odpowiedź zerowa z żądania HTTP HTTP Post

To jest mój 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; 
} 

Jest to skrypt php Mam zainteresowanie - W tej chwili mam ciężko kodowane dane znam istnieć w db i po prostu chcą się skupić na powrocie odpowiedź mówi, że użytkownik istnieje. Jest to moja 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

można przypisać, że 'responseString' przed wywołaniem' out.close () '?? Daj mi znać, jeśli ten ciąg jest "null" – Geros

+0

@ system32 Zrobiłem, jak zasugerowałeś, nadal zwraca wartość 'null'. Aplikacja nigdy się nie zawiesza, po prostu zawsze zwracała 'null' jako wartość' responseString'. – Javacadabra

+0

Umieść 'e.printStackTrace()' na blokach 'catch' i opublikuj stos. To może pomóc. – Geros

Odpowiedz

8

Jest pusty, ponieważ wykonuje się kod asynchronicznie. Wykonujesz Toast wynik, gdy żądanie HTTP nie zakończyło jeszcze wykonywania skryptu PHP.

Spróbuj umieścić toast za onPostExecute (wynik String) w swojej klasie AsyncTask.

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

Dzięki, to się stało! – Javacadabra

0

Nie otrzymujesz coś z respose ale umieszczenie w nim ... używać ByteArrayInputStream zamiast strumienia wyjściowego .....

Powiązane problemy