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

안녕하세요 쓰레드관련 오류나는것같은데요ㅠㅠ

0 추천

안녕하세요 자바 공부중인 학생입니다

안드로이드 공부하면서 프로그램 조금씩 만들어보는중인데요

로그인처리 하는데 자꾸 오류가나요

 

로그인 버튼을 클릭하면 http 통신을 하는 쓰레드가 실행되고 그 쓰레드 마지막에 핸들러를 호출해서 다음 페이지로 넘어가려고 해요

처음 로그인버튼 눌렀을때는 오류가 없는데 2번째 로그인 누르면 프로그램이 종료되면서 에러떠요

쓰레드가 종료가 안되서 그러는건가요?? 아님 다른데가 이상인걸까요?ㅠㅠ

 

public class LoginActivity extends Activity {
	SharedPreferences sp=null;
	SharedPreferences.Editor editor=null;
	boolean alive=false;
	
	EditText et1, et2;
	String email="", pwd="", irum="", phone="", data="";
	String email2="", pwd2="";
	
	Intent intent=null;
	boolean loginFlag=false;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_login);
		
		et1=(EditText)findViewById(R.id.editText1);
		et2=(EditText)findViewById(R.id.editText2);
		
		sp=this.getSharedPreferences("temp", 0);
		editor=sp.edit();
		
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.login, menu);
		return true;
	}
	
	public void mclick(View v){ 
		
		switch(v.getId()){
		case R.id.button1: //로그인 버튼 클릭시
			alive=true;
			t1.start();
			
			break;
		case R.id.button2: //회원가입
			intent=new Intent(this, JoinActivity.class);
			startActivity(intent);
			break;
		}
				
		
	}
	
	
	Thread t1  = new Thread(){
		
		public void run(){
			while(alive){
			try{
				email=et1.getText().toString();
				pwd=et2.getText().toString();
				HttpClient client = new DefaultHttpClient();
				String postURL = "http://192.168.2.3:8888/J/app/getInfo.jsp"; // 접속할 주소
				HttpPost post = new HttpPost(postURL);
				List params = new ArrayList(); // 파라미터를 ArrayList에 담아서 보냄.
				params.add(new BasicNameValuePair("email", email));
				
				UrlEncodedFormEntity ent = new UrlEncodedFormEntity(params, HTTP.UTF_8);
				post.setEntity(ent);
				
				HttpResponse responsePOST = client.execute(post);
				HttpEntity resEntity = responsePOST.getEntity();
				
				data=EntityUtils.toString(resEntity);
				
				handler.sendEmptyMessage(0);
				
				alive=false;
				sleep(500);
			}catch(Exception ex){
				ex.printStackTrace();
			}
			}
		}
	};
	
	Handler handler = new Handler(){

		@Override
		public void handleMessage(Message msg) {
			
			Log.i("data", data);
			try{
				JSONArray ja=new JSONArray(data);
				for(int i=0; i<ja.length(); i++){
					JSONObject j=ja.getJSONObject(i);
					email2=j.getString("email");
					pwd2=j.getString("pwd");
					irum=j.getString("irum");
					phone=j.getString("phone");
					
				}
				
				if(pwd.equals(pwd2)){
					register();
					Toast.makeText(getApplicationContext(), "로그인 성공", Toast.LENGTH_SHORT).show();
					intent=new Intent(LoginActivity.this, SelectSchoolActivity.class);
					startActivity(intent);
					finish();
				}else Toast.makeText(getApplicationContext(), "비번 틀렷음", Toast.LENGTH_SHORT).show();
				
	    	}catch(Exception ex){
				ex.printStackTrace();
			}
			
			super.handleMessage(msg);
		}
		
	};
	
	public void register(){
		editor.putString("email", email);
		editor.putString("irum", irum);
		editor.putString("phone", phone);
		
		editor.commit();
	}
}

 

 

 
wnlf (830 포인트) 님이 2013년 7월 23일 질문

2개의 답변

+1 추천
 
채택된 답변
네~~! 질문자꼐서 예상하신데로 쓰레드가 종료되지 않고 이미 루프중에 다시 쓰레드를 시작하려 하니 오류가 나느 겁니다.

스레드 안에 무한루프를 왜 주셨는지 자세히 모르겠지만.....

단지 통신을 위한 거라면 무한루프를 돌리고 다시 중지 시킬 필요가 없습니다.

원하는 통신 작업만 쓰레드에 정의 해주시면 됩니다.
ThisPlus (46,920 포인트) 님이 2013년 7월 23일 답변
wnlf님이 2013년 7월 23일 채택됨
답변감사드립니다
처음에 while 문 없이 실행해도 저거와 똑같이 뜨더라구요
인터넷 검색해보니 저런식으로해서 스레드를 종료시킨다고 하길래 따라해봤는데 그래도 오류가 계속나요ㅠ
아~~! 덧글 때문에 좀더 자세히 보았더니 그러하시겠네요...
그리고 쓰레드의 완전한 종료는 위와 같이 단순히 와일문을 멈춘다고 종료가 되지 않습니다. 이부분은 검색을 해보시면 아실테고....
와일문을 쓰기전에도 에러가 나는 부분도 똑같습니다.
쓰레드를 변수로 지정하시고 다시 부르셔서 이미 살아 있는 쓰레드를 다시 시작 하시려고 하니 문제가 되는 겁니다.
백그라운드 작업을 하고 싶으시면 안드로이드에서 아주 감사하게도AsyncTask라는걸 지원해 줍니다. 이를 추천드리고요

굳이 쓰레드를 쓰시 겠다면... 위와 같이 변수로 저장된 쓰레드를 호출 하지 마시고 매번 쓰레드를 생성 하심 됩니다.
뭐 자바에서 작업이 이미 멈춘 쓰레드는 알아서 처리 해준다기는 하지만 그래도 추천 하는 방법은 아니니 AsyncTask 사용을 적극 권하는 바입니다.

new Thread(new Runnable() {
            @Override
            public void run() {
                "작업 함수"
            }
        }).start();

생성해서 쓰시면 오류는 나지 않을 겁니다.
0 추천

아래는 에러코드입니다. 본문이 길어서 짤리네요ㅠ

 

07-23 00:50:57.450: W/dalvikvm(20181): threadid=1: thread exiting with uncaught exception (group=0x4001cb20)
07-23 00:50:57.450: E/AndroidRuntime(20181): Uncaught handler: thread main exiting due to uncaught exception
07-23 00:50:57.481: E/AndroidRuntime(20181): java.lang.IllegalStateException: Could not execute method of the activity
07-23 00:50:57.481: E/AndroidRuntime(20181):  at android.view.View$1.onClick(View.java:2037)
07-23 00:50:57.481: E/AndroidRuntime(20181):  at android.view.View.performClick(View.java:2370)
07-23 00:50:57.481: E/AndroidRuntime(20181):  at android.view.View.onTouchEvent(View.java:4185)
07-23 00:50:57.481: E/AndroidRuntime(20181):  at android.widget.TextView.onTouchEvent(TextView.java:6625)
07-23 00:50:57.481: E/AndroidRuntime(20181):  at android.view.View.dispatchTouchEvent(View.java:3715)
07-23 00:50:57.481: E/AndroidRuntime(20181):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:883)
07-23 00:50:57.481: E/AndroidRuntime(20181):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:883)
07-23 00:50:57.481: E/AndroidRuntime(20181):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:883)
07-23 00:50:57.481: E/AndroidRuntime(20181):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1700)
07-23 00:50:57.481: E/AndroidRuntime(20181):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1111)
07-23 00:50:57.481: E/AndroidRuntime(20181):  at android.app.Activity.dispatchTouchEvent(Activity.java:2061)
07-23 00:50:57.481: E/AndroidRuntime(20181):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1684)
07-23 00:50:57.481: E/AndroidRuntime(20181):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1701)
07-23 00:50:57.481: E/AndroidRuntime(20181):  at android.os.Handler.dispatchMessage(Handler.java:99)
07-23 00:50:57.481: E/AndroidRuntime(20181):  at android.os.Looper.loop(Looper.java:123)
07-23 00:50:57.481: E/AndroidRuntime(20181):  at android.app.ActivityThread.main(ActivityThread.java:4364)
07-23 00:50:57.481: E/AndroidRuntime(20181):  at java.lang.reflect.Method.invokeNative(Native Method)
07-23 00:50:57.481: E/AndroidRuntime(20181):  at java.lang.reflect.Method.invoke(Method.java:521)
07-23 00:50:57.481: E/AndroidRuntime(20181):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
07-23 00:50:57.481: E/AndroidRuntime(20181):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
07-23 00:50:57.481: E/AndroidRuntime(20181):  at dalvik.system.NativeStart.main(Native Method)
07-23 00:50:57.481: E/AndroidRuntime(20181): Caused by: java.lang.reflect.InvocationTargetException
07-23 00:50:57.481: E/AndroidRuntime(20181):  at com.example.back.LoginActivity.mclick(LoginActivity.java:67)
07-23 00:50:57.481: E/AndroidRuntime(20181):  at java.lang.reflect.Method.invokeNative(Native Method)
07-23 00:50:57.481: E/AndroidRuntime(20181):  at java.lang.reflect.Method.invoke(Method.java:521)
07-23 00:50:57.481: E/AndroidRuntime(20181):  at android.view.View$1.onClick(View.java:2032)
07-23 00:50:57.481: E/AndroidRuntime(20181):  ... 20 more
07-23 00:50:57.481: E/AndroidRuntime(20181): Caused by: java.lang.IllegalThreadStateException: Thread already started.
07-23 00:50:57.481: E/AndroidRuntime(20181):  at java.lang.Thread.start(Thread.java:1322)
07-23 00:50:57.481: E/AndroidRuntime(20181):  ... 24 more
wnlf (830 포인트) 님이 2013년 7월 23일 답변
...