2015-10-21 52 views
0

我正在通過下面的代碼在服務器響應中的AsyncTask serverResponse的從服務器獲取(安卓)響應文本

try { 
      // Add your data 
      List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
      nameValuePairs.add(new BasicNameValuePair("email", emailText)); 
      nameValuePairs.add(new BasicNameValuePair("password", passwordText)); 
      httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
      Log.e("post_", nameValuePairs.toString()); 
      // Execute HTTP Post Request 
      response = httpclient.execute(httppost); 
      serverResponse=EntityUtils.toString(response.getEntity()); 
      Log.e("RESPONSE1",serverResponse); 
      return serverResponse; 
     } 

值將失敗或我的日誌我得到成功。 然後按鈕單擊我檢查serverResponse的值導航到另一個activity.But按鈕單擊時serverResponse的值爲null.So我得到空指針異常。

loginbutton.setOnClickListener(new View.OnClickListener(){ 
     @Override 
     public void onClick(View v) { 
      emailText=loginemail.getText().toString(); 
      passwordText=loginpassword.getText().toString(); 
      new loginData().execute(emailText, passwordText); 
      Log.e("SERVERRESPONSE1",serverResponse); 
      if (serverResponse =="Success") { 
       Intent i= new Intent(getApplicationContext(),IndexActivity.class); 
       startActivity(i); 
      } 
      else if (serverResponse=="Fail"){ 
       Toast.makeText(getBaseContext(),"Invalid Username/Password!!",Toast.LENGTH_LONG).show(); 
      } 
      else { 
       Toast.makeText(getBaseContext(),"Invalid Username/Password!!",Toast.LENGTH_LONG).show(); 
      } 
     } 
    }); 

如何獲得按鈕點擊響應的corect值?

+0

請添加詳細代碼,並粘貼logcat輸出。 –

+0

我已編輯now..please檢查 –

回答

0

將此代碼添加到的loginData類的方法中。

Log.e("SERVERRESPONSE1",serverResponse); 
if(serverResponse.equals("Success")) { 
    Intent i= new Intent(getApplicationContext(),IndexActivity.class); 
    startActivity(i); 
} else if (serverResponse.equals("Fail")){ 
    Toast.makeText(getBaseContext(),"Invalid Username/Password!!",Toast.LENGTH_LONG).show(); 
} else { 
    Toast.makeText(getBaseContext(),"Invalid Username/Password!!",Toast.LENGTH_LONG).show(); 
} 

並將其從onClick()中刪除。

你應該在得到asynctask的迴應後通知用戶。 通過此鏈接瞭解how AsyncTask works

+0

但現在我也無法導航到其他活動(我正在獲得成功消息) –

+0

嘗試用YourActivity.this替換getApplicationContext() 這可能對您有所幫助。 –

+0

@ Divya-非常感謝您的幫助:) :) –

0

由於在檢查serverResponse之前沒有完成異步任務時間,因此您會收到空錯誤。適當的方法是在異步任務的onPostExecute部分內處理該邏輯。事情是這樣的......

public class GetServerResponse extends AsyncTask<Void, Void, String> { 
String emailText, passwordText; 


public GetDetailsAsyncTask(String emailText, String passwordText) { 
    this.emailText=emailText; 
    this.passwordText = passwordText; 
} 



@Override 
protected String doInBackground(Void... params) { 

    if (isCancelled()) 
     return null; 
    return [Call Method that accepts emailText and passwordText && returns a string (response text)]; 
} 

@Override 
protected void onPostExecute(String serverResponse) { 
    if(serverResponse!=null){ 
     if (serverResponse =="Success") { 
      Intent i= new Intent(getApplicationContext(),IndexActivity.class); 
      startActivity(i); 
     } 
     else if (serverResponse=="Fail"){ 
      Toast.makeText(getBaseContext(),"Invalid Username/Password!!",Toast.LENGTH_LONG).show(); 
     } 
     else { 
      Toast.makeText(getBaseContext(),"Invalid Username/Password!!",Toast.LENGTH_LONG).show(); 
     } 
    } 
} 

    @Override 
    protected void onPreExecute() { 
    } 

} 

如果你想有一個回調至包裹活動,你可以做如下...

//inside the async task class 
public void setListener(onServerResponselistener listener) { 
    this.mListener = listener; 
} 

public interface onServerResponselistener{ 
    public void success(); 

    public void fail(); 
} 

//then in your post execute, you could call this.mListener.success()/fail() depending on the response. Make sure to check for null. 

然後在你的包裹活動/類,你可以做到以下幾點。 ..

GetServerResponse oReturn = new GetServerResponse (email,password); 
    oReturn.setListener(new onServerResponselistener() { 

     @Override 
     public void success() { 
     //handle a successful call 
     //go to the next activity 
     } 

     @Override 
     public void fail() { 
     //popup "incorrect credentials etc." 
     } 
    }); 
oReturn.execute(); 
+0

但是現在我也無法導航到其他活動(我收到了成功信息) –

+0

@AmitNair - 您可以實現一個界面,其中包裝活動可以覆蓋。我會更新代碼 – ElliotM

+0

非常感謝您的幫助.. :) –