마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

android -> php 연동 중 오류발생합니다. 조언좀 부탁드립니다...

0 추천
///Java Source


public class MainActivity extends Activity {

 String myId, myPWord, myTitle, mySubject, myResult;

 @Override
 public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.activity_main);

  
  findViewById(R.id.button_submit).setOnClickListener(buttonClick);

 }

 // ------------------------------

 // button Click

 // ------------------------------

 Button.OnClickListener buttonClick = new Button.OnClickListener() {

  public void onClick(View v) {

   // 사용자가 입력한 내용을 전역변수에 저장한다

   myId = ((EditText) (findViewById(R.id.edit_Id))).getText()
     .toString();

   myPWord = ((EditText) (findViewById(R.id.edit_pword))).getText()
     .toString();

   myTitle = ((EditText) (findViewById(R.id.edit_title))).getText()
     .toString();

   mySubject = ((EditText) (findViewById(R.id.edit_subject)))
     .getText().toString();

   HttpPostData(); // 서버와 자료 주고받기

  }

 };

 // ------------------------------

 // Http Post로 주고 받기

 // ------------------------------

 public void HttpPostData() {

  try {

   // --------------------------

   // URL 설정하고 접속하기

   // --------------------------

   URL url = new URL("http://172.16.103.221/test.php");

   // URL url = new URL("http://korea-com.org/foxmann/lesson01.php); //
   // URL 설정

   HttpURLConnection http = (HttpURLConnection) url.openConnection(); // 접속

   // --------------------------

   // 전송 모드 설정 - 기본적인 설정이다

   // --------------------------

   http.setDefaultUseCaches(false);

   http.setDoInput(true); // 서버에서 읽기 모드 지정

   http.setDoOutput(true); // 서버로 쓰기 모드 지정

   http.setRequestMethod("POST"); // 전송 방식은 POST

   // 서버에게 웹에서 <Form>으로 값이 넘어온 것과 같은 방식으로 처리하라는 걸 알려준다

   http.setRequestProperty("content-type",
     "application/x-www-form-urlencoded");

   // --------------------------

   // 서버로 값 전송

   // --------------------------

   StringBuffer buffer = new StringBuffer();

   buffer.append("id").append("=").append(myId).append("&");

   // php 변수에 값 대입

   buffer.append("pword").append("=").append(myPWord).append("&");
   buffer.append("title").append("=").append(myTitle).append("&");
   buffer.append("subject").append("=").append(mySubject);

   OutputStreamWriter outStream = new OutputStreamWriter(
     http.getOutputStream(), "EUC-KR");

   Log.d("check", "1" + myId);

   PrintWriter writer = new PrintWriter(outStream);

   Log.d("check", "2");

   writer.write(buffer.toString());

   writer.flush();

   Log.d("check", "3");

   // --------------------------

   // 서버에서 전송받기

   // --------------------------

   InputStreamReader tmp = new InputStreamReader(
     http.getInputStream(), "EUC-KR");

   BufferedReader reader = new BufferedReader(tmp);

   StringBuilder builder = new StringBuilder();

   String str;

   while ((str = reader.readLine()) != null) { // 서버에서 라인단위로 보내줄 것이므로
              // 라인단위로 읽는다

    builder.append(str + "\n"); // View에 표시하기 위해 라인 구분자 추가

   }

   myResult = builder.toString(); // 전송결과를 전역 변수에 저장

   Log.d("check", "Stirng" + myResult);

   ((TextView) (findViewById(R.id.text_result))).setText(myResult);

   Toast.makeText(MainActivity.this, "전송 후 결과 받음", 0).show();

  } catch (MalformedURLException e) {

   //

  } catch (IOException e) {

   //

  } // try

 } // HttpPostData

} // Activity 

 

 

//PHP Source

<?

// 변수 내용 확인

//if ($id == "") 

$id = $_POST["id"]; 

//if ($pword == "") 

$pword = $_POST["pword"];

//if ($title == "") 

$title = $_POST["title"];

//if ($subject == "") 

$subject = $_POST["subject"];

// 변수 내용 출력

echo ("

  님께서 PHP로 전송한 내용입니다

  -----------------------------------------------------------------\r\n

  사용자 ID : $id \r\n

  비밀번호 : $pword \r\n

  개념 : $title \r\n

  대책 : $subject \r\n

  -----------------------------------------------------------------\r\n

  축하드립니다. lesson01.php 를 정삭적으로 호출하셨습니다!

");

?>

 

소스는 이러 합니다.

EdiText입력 후 버튼을 누르면

Http Post 방식으로 android -> php에 전송해주고 다시 php->android로 출력해주는 예제 인데요.

웹브라우저, 다른 pc웹브라우저, 어큐뮬레이터로는 정상적으로 동작 합니다.

근데 핸드폰으로 실행해서 버튼 누르면, "예상치 않게 중지되었습니다." 라고 오류가 떠서 어플이 죽어요. 왜 그럴까요 미치겠습니다 ㅜㅜ

 

찬스님 (300 포인트) 님이 2013년 5월 14일 질문
1. 로그 보세요.
2. 로그 보면, 네트웍코드 백그라운드 스레드에서 처리하라는 안내 있을겁니다.
감사합니다. asynctask 클래스 쓰는 되네요.
asynctask 어떻게 쓰셨는지 알수 있을까요??

2개의 답변

0 추천
이유는 간단하죠 쓰레드 돌리세요 ㅋㅋ

젤리빈인가 모르겟찌만 외부 통신할때 쓰레드 돌려야 된다고 되어있어요 ㅎㅎ
익명사용자 님이 2013년 5월 15일 답변
감사합니다. http쓸때 필요하네요..
0 추천
정책이 바껴서 UI 스레드 안에서 처리하면 안되요.

 asynctask 검색해보세요.
chemkaaa (6,030 포인트) 님이 2013년 5월 15일 답변
감사합니다.  비동기식으로 해야겠군요,..
...