안드로이드 android.os.NetworkOnMainThreadException 에러


아래와 같은 에러가 자꾸 발생하는데요.

android.os.NetworkOnMainThreadException

이미 매니페스트에 internet도 추가했는데..

<uses-permission android:name="android.permission.INTERNET" />

자료를 찾아보면 앱의 메인 실행 쓰레드에서 네트워킹 관련된 작업을 수행할수없다는건데
제가 궁금한건 제 코드를 안드로이드에서 권장하는 방법으로 다시 짜는거에요.

아래는 제 코드입니다.

package com.problemio;

import java.io.InputStream;
import java.util.ArrayList;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
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 android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class LoginActivity extends Activity 
{
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login);

        // 로그인 이메일 폼을 보여준다. 
        final EditText loginEmail = (EditText) findViewById(R.id.login_email);  
        String name = loginEmail.getText().toString();  

        // 비밀번호 폼을 보여준다. 
        final EditText password = (EditText) findViewById(R.id.password);  
        String text = password.getText().toString();                  

        // 전송버튼 
        Button submit = (Button)findViewById(R.id.submit);   




        // Show options for create-profile and forgot-password




        submit.setOnClickListener(new Button.OnClickListener() 
        {  
           public void onClick(View v) 
           {
              String email = loginEmail.getText().toString();
              String pass = password.getText().toString(); 
              sendFeedback(pass, email);
            }
        });        
    }


    public void sendFeedback(String pass , String email) 
    {  
        Log.d( "1" , pass );
        Log.d( "1" , email );

        // db로가서 이런 아이디가있는지 확인 
        // 어떻게해야하죠? :)
        ArrayList<NameValuePair> postParameters = new ArrayList<NameValuePair>();  
        postParameters.add(new BasicNameValuePair("username", email ));  
        postParameters.add(new BasicNameValuePair("password", pass ));

        String responseString = null;

        try 
        {  
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost("myUrl");

            //이게 뭘하는건지 잘모르겠어요 :)
            httppost.setEntity(new UrlEncodedFormEntity(postParameters));

            // This is the line that send the request
            HttpResponse response = httpclient.execute(httppost);

            HttpEntity entity = response.getEntity();            

            InputStream is = entity.getContent();
        } 
        catch (Exception e) 
        {     
            Log.e("log_tag", "Error in http connection "+e.toString());
        }        
    }          
}

뭐가 잘못된건가요... 고쳐주세요!

  • 2016년 05월 27일에 작성됨

조회수 581


1 답변


좋아요
0
싫어요
채택취소하기

NetworkOnMainThreadException:

이 예외는 메인 쓰레드에서 네트워킹을 시도했을때 발생하는 에러인데요.

sendfeedback메소드를 asynctask로 호출시키면 잘 동작할겁니다. 보통 webserver 요청을 하는 연산은 많은 시간이 소요되서 기다리는동안 메인쓰레드가 무응답상태가되기때문에 그걸 피하기 위해 다른 쓰레드로 돌려주어야합니다. 그러므로 asyncTask가 제격입니다.

http://android-developers.blogspot.in/2009/05/painless-threading.html 여기로 가면 asynctask에 대한 정보가있을겁니다.

  • 2016년 05월 28일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close