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

이놈에 handler클래스 .. 절너무 힘들게하네여ㅜㅜ

0 추천
//핸들러
 private Handler handler = new Handler(){
  public void handleMessage(Message msg){
   
   try{
    Log.d("--", "Login2 = " + msg.obj.toString());
    if(msg.obj.toString().equals("loginfail")){
     ErrorViewMessageSet(msg.obj.toString());
     loaddingDialog.dismiss();
    }else{
     goSelectPage(msg.obj.toString());
     loaddingDialog.dismiss();
    }
   }catch (Exception e) {
    // TODO: handle exception
    Log.d("ErrorLog", "LoginActivity : handler MessageError =" + e.getMessage());
   }
  }
 };

핸들러를 엑티비티 안에서 이렇게 구현햇구요..

 

@Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  requestWindowFeature(Window.FEATURE_NO_TITLE);
  setContentView(R.layout.activity_intro);
  image_intro = (ImageView)findViewById(R.id.intro);
  new Thread (new Runnable() {
   @Override
   public void run() {
    // TODO Auto-generated method stub
    try{
     Animation alphaAnim= AnimationUtils.loadAnimation(Intro.this, R.anim.alpha);  // 애니 설정 파일
     image_intro.startAnimation(alphaAnim);
     Thread.sleep(4000);
     usersearchIntent();
    }catch (Exception e) {
     // TODO: handle exception
    }
   }
  }).start();
 }
 
 //화면이동
 private void usersearchIntent() {
  // TODO Auto-generated method stub
  
  SharedPreferences pref = getSharedPreferences("userinfo", MODE_PRIVATE);
  String userid = pref.getString("id", "");
  String password = pref.getString("password", "");
  
        if(userid.toString() != ""){
         Log.d("--", userid);
         new Login().LoginProcess(handler, userid, password);
   viewDialog("로그인중...");
   
        }else{
      //회원가입 페이지로이동
      Intent intent = new Intent(this,ProvisionActivity.class);
         startActivity(intent);
         finish();
        }
        

 } 

 private void viewDialog(String msg){
  this.loaddingDialog = ProgressDialog.show(this, null, msg);
 }
 
 private void ErrorViewMessageSet(String msg){
  try{
   alert = new AlertDialog.Builder(this);
   new ViewMessageSet(alert, msg).ErrorMessageSet();
  }catch (Exception e) {
   // TODO: handle exception
   Log.d("Errorlog", "Intro : ErrorViewMessageSet" + e.getMessage());
  }
 }
 
 private void goSelectPage(String string) {
  // TODO Auto-generated method stub
  Log.d("--", "Login2 =  goSelectPage");
  
 }
 
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.intro, menu);
  return true;
 }

이게 엑티비티 소스구요..

 

DB에서 로그인 결과값 서버에서 잘가져옵니다.

제일위에 있는 handler클래스에서 goSelectPage 함수도 잘 호출하고 그안에 있는 log.d값도 잘 뿌려줍니다..................

그런데....................왜 handler에 있는 exception Log.d가 뜨는걸까요 ㅜㅜ 에러 메세지는.. null이라는데..

 

다른 엑티비티에서도 저것과 같은 핸들러를 구현해서 똑같이 쓰고 있습니다............

받는 결과값도 같구요 그냥 카피한건데.. 이부분에서만 null이뜨네요;; 이거 무슨경우일까요;;;;

mamongs (4,050 포인트) 님이 2013년 4월 3일 질문

4개의 답변

0 추천
e.printStackTrace();

e.toString() 으로 해보세요.
갈무리 (12,430 포인트) 님이 2013년 4월 3일 답변
nullpointexception...뜹니다..ㅜㅜ
0 추천
브레이크 포인트 찍어서 추적은 해보셧나요?
갸아악 (21,260 포인트) 님이 2013년 4월 3일 답변
0 추천

goSelectPage 메소드가 잘 실행되었는데

NullPointException 이 발생했다면

loaddingDialog 가 null이겠죠.

원조안드로이드 (58,190 포인트) 님이 2013년 4월 3일 답변
당신은 천재......................................
원조안드로이드 님한테 정말 도움많이 받네요 ㅜ 감사합니다.
0 추천
먼저 쓰레드에서 usersearchIntent()메소드를 호출하였습니다.

usersearchIntent()메소드 안에서 viewDialog("로그인중...")메소드를 호출합니다.

viewDialog("로그인중...")메소드에서 dialog.show()를 해줘버립니다.

이부분에서 이미 예외가 발생합니다. thread상에서 UI제어를 해줬기때문에

그런데 이부분 예외 캐치는 해줬지만 메세지를 띄워준다거나하는 처리를 해주지 않았기때문에

어플이 강제종료는 되지않았지만 예외가 발생했다는걸 몰랐던겁니다.

this.loaddingDialog = ProgressDialog.show(this, null, msg); 에서 처리가 안되고 예외가 발생하였기 때문에

loaddingDialog는 null 상태입니다.

그런상태에서 핸들러에서 loaddingDialog.dismiss()를 해줘버리니

당연히 NullPointerException이 발생되는거지요.

 

중요한부분은

쓰레드에서 this.loaddingDialog = ProgressDialog.show(this, null, msg);을 해주엇기때문에

예외가 발생하였는데 예외처리를 제대로 해주지않았기때문에 이사실을 몰랏고

그뒤에 loaddingDialog 상태가 null임에도 불구하고 loaddingDialog.dismiss()를 호출하여

다시 예외가 발생하였다는거죠.
얼룩돼지 (15,720 포인트) 님이 2013년 4월 3일 답변
잘못된 부분을 정확하게 알려주셔서 감사합니다.ㅜ
...