안드로이드 android.os.NetworkOnMainThreadException 에러
조회수 6180회
아래와 같은 에러가 자꾸 발생하는데요.
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());
}
}
}
뭐가 잘못된건가요... 고쳐주세요!
1 답변
-
NetworkOnMainThreadException:
이 예외는 메인 쓰레드에서 네트워킹을 시도했을때 발생하는 에러인데요.
sendfeedback메소드를 asynctask로 호출시키면 잘 동작할겁니다. 보통 webserver 요청을 하는 연산은 많은 시간이 소요되서 기다리는동안 메인쓰레드가 무응답상태가되기때문에 그걸 피하기 위해 다른 쓰레드로 돌려주어야합니다. 그러므로 asyncTask가 제격입니다.
http://android-developers.blogspot.in/2009/05/painless-threading.html 여기로 가면 asynctask에 대한 정보가있을겁니다.
댓글 입력