package kim.android.test;
import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList;
import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.ResponseHandler; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserFactory;
import android.app.Activity; import android.app.ProgressDialog; import android.graphics.Color; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.Toast;
public class LoginActivity extends Activity implements OnClickListener { private EditText id; private EditText passwd; private ProgressDialog pDialog; private LinearLayout layout01; private Button button;
@Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.login_layout); id=(EditText)findViewById(R.id.id); passwd=(EditText)findViewById(R.id.passwd); button=(Button)findViewById(R.id.loginButton); button.setOnClickListener(this); layout01=(LinearLayout)findViewById(R.id.layout01); }
@Override public void onClick(View v) { // TODO Auto-generated method stub loginProcess(); //로그인 버튼이 클릭되면 로그인 처리를 시작한다. }
// 네트웍 처리결과를 화면에 반영하기 위한 안드로이드 핸들러
// responseHandler에 의해 처리된 결과가 success인 경우 바탕화면을 초록색으로 바꾸고
// 로그인이 성공했다는 메시지를 토스트로 출력
// 로그인이 실패한 경우 바탕화면을 빨강색으로 바꾸고 로그인실패 메시지를 토스트로 출력 private final Handler handler = new Handler() { @Override public void handleMessage(Message msg) { pDialog.dismiss(); String result=msg.getData().getString("RESULT"); if ( result.equals("success") ) { layout01.setBackgroundColor(Color.GREEN); Toast.makeText(LoginActivity.this, "성공적으로 로그인하였습니다.", Toast.LENGTH_LONG).show() ; } else { layout01.setBackgroundColor(Color.RED); Toast.makeText(LoginActivity.this, "로그인 실패", Toast.LENGTH_LONG),show() ; } } };
//서버에서 전송된 XML 데이터를 파싱하기 위한 메서드
//이 예제에서는 서버에서 로그인이 성공하는 경우(id=kim&passwd=111)하는 경우 <result>success</result>
//실패하는 경우 <result>failed</result>를 반환하도록 설정해 두었다. public String parsingData(InputStream input){ String result=null; try { XmlPullParserFactory factory= XmlPullParserFactory.newInstance(); XmlPullParser parser = factory.newPullParser(); parser.setInput(new InputStreamReader(input)); while ( parser.next() != XmlPullParser.END_DOCUMENT) { String name=parser.getName(); if ( name != null && name.equals("result")) result=parser.nextText(); } }catch(Exception e){e.printStackTrace();} return result; }
//로그인 버튼이 클릭되면 수행되는 메서드
// responseHandler는 Http요청에 대한 HttpResponse가 반환되면 결과를 처리하기 위한
// 콜백메서드를 정의하고 있는 객체이다.
// Response를 받게 되면 parsingData()메서드를 호출하여 서버로 부터 받은 XML 파일을 처리하여
// 그결과를 result 문자열로 반환받는다.
// 이렇게 반환받은 result문자열을 화면에 반영하기위해 안드로이드UI핸들러인 handler를 통해 값을 전달한다. public void loginProcess() { final ResponseHandler<String> responseHandler= new ResponseHandler<String>() {
@Override public String handleResponse(HttpResponse response) throws ClientProtocolException, IOException { String result=null; HttpEntity entity=response.getEntity(); result=parsingData(entity.getContent()); Message message=handler.obtainMessage(); Bundle bundle=new Bundle(); if ( result.equals("success") ) bundle.putString("RESULT", "success"); else bundle.putString("RESULT", "failed"); message.setData(bundle); handler.sendMessage(message); return result; } };
// 로그인이 처리되고 있다는 다이얼로그를 화면에 표시한다. pDialog=ProgressDialog.show(this, "", "로그인 처리중....");
// 서버에 HTTP 처리 요청은 새로운 스레드를 생성하여 비동기식으로 처리하는것이 효율적이다. new Thread() {
@Override public void run() { String url = "http://192.168.10.2:8080/login.jsp"; HttpClient http = new DefaultHttpClient(); try { // 서버에 전달할 파라메터 세팅 ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); nameValuePairs.add(new BasicNameValuePair("id", id.getText().toString())); nameValuePairs.add(new BasicNameValuePair("passwd", passwd.getText().toString()));
// 응답시간이 5초가 넘으면 timeout 처리하려면 아래 코드의 커맨트를 풀고 실행한다. // HttpParams params = http.getParams(); // HttpConnectionParams.setConnectionTimeout(params, 5000); // HttpConnectionParams.setSoTimeout(params, 5000);
// HTTP를 통해 서버에 요청을 전달한다.
// 요청에 대한결과는 responseHandler의 handleResponse()메서드가 호출되어 처리한다.
// 서버에 전달되는 파라메터값을 인코딩하기위해 UrlEncodedFormEntity() 메서드를 사용한다.
HttpPost httpPost = new HttpPost(url); UrlEncodedFormEntity entityRequest = new UrlEncodedFormEntity(nameValuePairs, "UTF-8"); httpPost.setEntity(entityRequest); http.execute(httpPost,responseHandler); }catch(Exception e){e.printStackTrace();} } }.start(); //스레드를 실행시킨다. }
}
|