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

안드로이드 mysql 연동중 AsyncTask 오류 문의드립니다.

0 추천


소스코드입니다.

public class LogInActivity extends Activity{

 
 private TextView titleTextView;
 private TextView joinTextView; 
 private EditText edtId;
 private EditText edtPass; 
 private EditText edtPasschk;
 private String a = "";
 
 
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.login);
  
  Typeface typeFace = Typeface.createFromAsset(getAssets(), "fonts/NanumBarunGothicBold.ttf"); 
  
  titleTextView = (TextView) findViewById(R.id.title_text);
  titleTextView.setTypeface(typeFace);
  EditText edtId=(EditText)findViewById(R.id.edtid);
  EditText edtPass=(EditText)findViewById(R.id.edtpass);
  EditText edtPasschk = (EditText)findViewById(R.id.edtpasschk);

 }
 
 public void onClick(View v) {
   switch (v.getId()) {
  case R.id.btn_login: {
   //String id = edtId.getText().toString(); // 사용자 입력된 아이디 값을 id 변수에 넣습니다.
   //String pass = edtPass.getText().toString(); // 사용자 입력된 패스워드를 pass변수에 넣습니다.
   
   //if(id.trim().length() > 0 && pass.trim().length() > 0) // 받은 값들의 공백제거
   GetData task1 = new GetData();
   task1.execute(new String[]{"http://127.0.0.1:3306/select.php"});
   
     break;
  }       
  
  case R.id.btn_find_id: {    
   Toast.makeText(this, v.getId() + "아이디찾기",  Toast.LENGTH_LONG).show();
   Intent intent = new Intent(LogInActivity.this, FindIdActivity.class);
   startActivity(intent);   
   break;
   
  }
  case R.id.btn_find_password: {
   Toast.makeText(this, v.getId() + "비밀번호찾기",  Toast.LENGTH_LONG).show();
   Intent intent = new Intent(LogInActivity.this, FindPassActivity.class);
   startActivity(intent);   
   break;
   
  }
  case R.id.btn_join: {
   Toast.makeText(this, v.getId() + "회원가입",  Toast.LENGTH_LONG).show();
   Intent intent = new Intent(LogInActivity.this, RegisterActivity.class);
   startActivity(intent);   
   break;
        
  }
     }
 }
 public class GetData extends AsyncTask<String, Void, Boolean>{
  
  //ProgressDialog dialog = new ProgressDialog(LogInActivity.this);
        String text = "";  
     
   @Override
   protected void onPreExecute() {
    //dialog.setMessage("데이터를 읽어오는중..");
    //dialog.show();
   }  
  
   @Override
   protected Boolean doInBackground(String... urls) {
    
   
    InputStream is1;
   
    for(String url1 : urls){   // inputstream을 통해 웹에서 데이터를 읽어옵니다.
     try{
               
      HttpClient httpclient = new DefaultHttpClient();
      HttpPost httppost = new HttpPost(url1); // 셀렉트 테이블 해서 정보를 가져옵니다.
      HttpResponse response = httpclient.execute(httppost);
      
            Log.d("TAG", "111"+url1); 
      
      is1 = response.getEntity().getContent();
              
       }
       catch(Exception e){
        Toast.makeText(LogInActivity.this, e.toString(), Toast.LENGTH_SHORT).show();
        return false;
       }

     // STRING 텍스트로 변환 시키는 작업을 합니다.
       BufferedReader reader;
       try {
           reader = new BufferedReader(new InputStreamReader(is1, "iso-8859-1"),8);
           String line = null;
           while((line = reader.readLine()) != null) {
               text += line + "\n";
           }
           is1.close();
       }catch(Exception e1){
       e1.printStackTrace();
       }
       
       // json 변환 후 붙여넣는 작업.
      
       try{
        Log.d("TAG", "1111"+text);
        JSONObject jobject = new JSONObject(text);
        JSONArray results = jobject.getJSONArray("result");
        
        a += "id : " + jobject.get("id");
        a += "\n";
        a += "password : " + jobject.get("password");
       }
       catch(JSONException e){
        e.printStackTrace();
       }
      }
    return true;
   }
    
   protected void onPostExecute(Boolean result){
    if(result == true){
     Toast.makeText(LogInActivity.this, text, Toast.LENGTH_LONG).show();
     // text 출력해보기          
    }
    else{
     Toast.makeText(LogInActivity.this, "에러임", Toast.LENGTH_SHORT).show();
    }    
    //dialog.dismiss();
      }
 }
}
    

기본적으로 onPreExecute() -> doInBackground() ->  onPostExecute()  순서로 작업이 진행되는 쓰레드 인 것은 알고있습니다. 그리고 기본적으로 쓰레드를 쓸 때 쓰레드에서 메인 쓰레드로 UI 를 호출하는 건 허용되지 않아 신경써서 코딩했습니다. 지금 Log찍어서 어디서 값을 못받아오나 체크를해보았는데
doInBackground() 메서드 안에 HTTP 통신으로 URL을 받아오는 구문에서 URL(PHP경로)를 인식하지 못하는 것 같습니다. 다시말해,

HTTP 통신 하는 부분에서 웹접속을 못하는 건지...

이 부분에서 로그를 찍어보았는데   111http://127.0.0.1:3306/select.php  이렇게는 찍는데
그 뒤로 접속을 못하는 것 같습니다. 무슨 이유인지, 어떤 부분을 체크해야하는지 문의드립니다.

sta48 (290 포인트) 님이 2015년 5월 12일 질문
로그캣 에러 입니다.

05-12 01:55:20.960: W/dalvikvm(815): threadid=11: thread exiting with uncaught exception (group=0x40a13300)
05-12 01:55:21.020: E/AndroidRuntime(815): FATAL EXCEPTION: AsyncTask #1
05-12 01:55:21.020: E/AndroidRuntime(815): java.lang.RuntimeException: An error occured while executing doInBackground()
05-12 01:55:21.020: E/AndroidRuntime(815):  at android.os.AsyncTask$3.done(AsyncTask.java:299)
05-12 01:55:21.020: E/AndroidRuntime(815):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
05-12 01:55:21.020: E/AndroidRuntime(815):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
05-12 01:55:21.020: E/AndroidRuntime(815):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
05-12 01:55:21.020: E/AndroidRuntime(815):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
05-12 01:55:21.020: E/AndroidRuntime(815):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
05-12 01:55:21.020: E/AndroidRuntime(815):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
05-12 01:55:21.020: E/AndroidRuntime(815):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
05-12 01:55:21.020: E/AndroidRuntime(815):  at java.lang.Thread.run(Thread.java:856)
05-12 01:55:21.020: E/AndroidRuntime(815): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
05-12 01:55:21.020: E/AndroidRuntime(815):  at android.os.Handler.<init>(Handler.java:121)
05-12 01:55:21.020: E/AndroidRuntime(815):  at android.widget.Toast$TN.<init>(Toast.java:322)
05-12 01:55:21.020: E/AndroidRuntime(815):  at android.widget.Toast.<init>(Toast.java:91)
05-12 01:55:21.020: E/AndroidRuntime(815):  at android.widget.Toast.makeText(Toast.java:238)
05-12 01:55:21.020: E/AndroidRuntime(815):  at com.hyup.droneparcel.LogInActivity$GetData.doInBackground(LogInActivity.java:138)
05-12 01:55:21.020: E/AndroidRuntime(815):  at com.hyup.droneparcel.LogInActivity$GetData.doInBackground(LogInActivity.java:1)
05-12 01:55:21.020: E/AndroidRuntime(815):  at android.os.AsyncTask$2.call(AsyncTask.java:287)
05-12 01:55:21.020: E/AndroidRuntime(815):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
05-12 01:55:21.020: E/AndroidRuntime(815):  ... 5 more
ps. 인터넷 퍼미션 주었습니다...

2개의 답변

0 추천
지금 에뮬레이터로 테스트 하고 계신건가요?

일단 doInBackground 내에 있는 Toast는 주석처리하고 e.printStackTrace()로 바꿔서 다시 로그 올려보세여
Gradler (109,780 포인트) 님이 2015년 5월 12일 답변
토스트 제거 후 로그입니다.
모두 노란색으로...시스템 에러 코드입니다.

05-12 05:38:25.650: W/System.err(897): org.apache.http.conn.HttpHostConnectException: Connection to http://127.0.0.1:3306 refused
05-12 05:38:25.660: W/System.err(897):     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:183)
05-12 05:38:25.660: W/System.err(897):     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
05-12 05:38:25.670: W/System.err(897):     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
05-12 05:38:25.670: W/System.err(897):     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
05-12 05:38:25.670: W/System.err(897):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
05-12 05:38:25.680: W/System.err(897):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
05-12 05:38:25.680: W/System.err(897):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
05-12 05:38:25.680: W/System.err(897):     at com.hyup.droneparcel.LogInActivity$GetData.doInBackground(LogInActivity.java:130)
05-12 05:38:25.680: W/System.err(897):     at com.hyup.droneparcel.LogInActivity$GetData.doInBackground(LogInActivity.java:1)
05-12 05:38:25.680: W/System.err(897):     at android.os.AsyncTask$2.call(AsyncTask.java:287)
05-12 05:38:25.690: W/System.err(897):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
05-12 05:38:25.700: W/System.err(897):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
05-12 05:38:25.700: W/System.err(897):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
05-12 05:38:25.700: W/System.err(897):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
05-12 05:38:25.700: W/System.err(897):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
05-12 05:38:25.710: W/System.err(897):     at java.lang.Thread.run(Thread.java:856)
05-12 05:38:25.710: W/System.err(897): Caused by: java.net.ConnectException: failed to connect to /127.0.0.1 (port 3306): connect failed: ECONNREFUSED (Connection refused)
05-12 05:38:25.730: W/System.err(897):     at libcore.io.IoBridge.connect(IoBridge.java:114)
05-12 05:38:25.730: W/System.err(897):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
05-12 05:38:25.730: W/System.err(897):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
05-12 05:38:25.730: W/System.err(897):     at java.net.Socket.connect(Socket.java:842)
05-12 05:38:25.740: W/System.err(897):     at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)
05-12 05:38:25.750: W/System.err(897):     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144)
05-12 05:38:25.750: W/System.err(897):     ... 15 more
05-12 05:38:25.750: W/System.err(897): Caused by: libcore.io.ErrnoException: connect failed: ECONNREFUSED (Connection refused)
05-12 05:38:25.770: W/System.err(897):     at libcore.io.Posix.connect(Native Method)
05-12 05:38:25.770: W/System.err(897):     at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85)
05-12 05:38:25.770: W/System.err(897):     at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
05-12 05:38:25.780: W/System.err(897):     at libcore.io.IoBridge.connect(IoBridge.java:112)
05-12 05:38:25.780: W/System.err(897):     ... 20 more
방화벽 문제 아닌가여?
서버가 접속을 거절당하는 케이스같네여
저도 서버 쪽은 경험이 없어서 더이상 도움을 드리기 힘들것같습니다.
그리고 에뮬레이터에서 테스트 중인것인지에 대한 답변은 아직 않하셨네요

혹시 단말에서 테스트중이라면 당연히 안되는게 맞을테고요
0 추천

>그리고 기본적으로 쓰레드를 쓸 때 쓰레드에서 메인 쓰레드로 UI 를 호출하는 건 허용되지 않아 신경써서 >코딩했습니다. 

라고 적혀있는데,, doInBackground안에 toast는 뭘까요.. 일단 위에 답변 해주신분 말대로

toast 없애시고 e.printStackTrace로 찍는게 우선입니다. 

지금 로그켓에러는 doInBackground안에 toast에서 발생하고 있으니 일단 이것부터 해결하시고

왜 catch로 빠지는지 봐야겠죠?

 

익명사용자 님이 2015년 5월 12일 답변
...