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

안드로이드 http url 네트워크 예외 처리

0 추천

안녕하세요 

예외 처리와 관련해서 질문을 하나 드리려 합니다

 

제가 html 값을 파싱해서 폰에 띄워주는 앱을 만들었는데요

시작하고 옵션에서 두 주소중 하나를 선택할 수 있습니다

문제는 두 주소를 선택하게 한 이유가, 둘중의 한 주소가 아예 서버가 꺼져 있을 가능성이 크기 때문입니다

제 소스로는, 만약에 유효하지 않은 URL을 선택하고 리프레시를 누르면, 앱이 아예 종료되 버립니다

예외 처리용 핸들러는 만들어 두었는데, 어디에 적용해야 하는지 알수가 없습니다

URL url = new URL(mAddr);

을 사용합니다

제가 구글링해본 바로는, 주소가 유효하지 않을 시

MalformedURLException 가 리턴된다고 하는데

그런거 없고 그냥 앱이 강제로 종료되 버립니다

 

저는 현재 유효하지 않은 주소를 옵션에서 선택하더라도,

앱이 강제 종료되지 않고 대신

예외 처리용 핸들러가 작동되게 하고 싶습니다

핸들러는

 Handler mAfterDown2 = new Handler() {// 핸들러
  public void handleMessage(Message msg) {
   Toast.makeText(getApplicationContext(), "내친구 화분을 켜주세요",
     Toast.LENGTH_LONG).show();
   // try {
   // Thread.sleep(100000);
   // finish();
   // } catch (InterruptedException e) {
   // e.printStackTrace();
   // }
  }
 };

입니다

 

 

혹시 답변하시는데 도움 되실까 하여 전체 소스를 아래에 첨부합니다

제 메인 액티비티입니다

package ex.myfot;

import java.io.*;
import java.net.*;

import org.apache.http.*;
import org.apache.http.client.*;
import org.apache.http.client.methods.*;
import org.apache.http.impl.client.*;

import ex.myfot.R.layout;
import ex.myfot.R;

import android.*;
import android.app.*;
import android.os.*;
import android.view.*;
import android.widget.*;

// 자바의 네트워크 클래스 사용
public class MainActivity extends Activity {
 ProgressDialog mProgress;
 DownThread mThread;
 String juso;
 
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  //juso = "http://www.nalda.vv.si";
  juso = "http://192.168.43.136";

  // 이미지버튼 클릭시 스레드 실행
  ImageButton imgbtn = (ImageButton) findViewById(R.id.imageButton1);
  imgbtn.setOnClickListener(new View.OnClickListener() {
   public void onClick(View v) {
    mProgress = ProgressDialog.show(MainActivity.this,
      "잠시 기다려 주세요", "화분과 대화중...");
    mThread = new DownThread(juso);
    mThread.start();

   }
  });

  // 처음 실행시 한번 값 읽어옴(스레드 실행)

  mProgress = ProgressDialog.show(MainActivity.this, "잠시 기다려 주세요",
    "화분과 대화중...");
  mThread = new DownThread(juso);
  mThread.start();
  
  

 }
 public boolean onCreateOptionsMenu(Menu menu) {
  super.onCreateOptionsMenu(menu);
  MenuItem item=menu.add(0,1,0,"GOMNET");
  menu.add(0,2,0,"Android5435");
  SubMenu etc = menu.addSubMenu("기타");
  etc.add(0,3,0,"myfot.iptime.org");
  etc.add(0,4,0,"192.168.43.136");

  return true;
 }
 public boolean onOptionsItemSelected(MenuItem item) {
  switch (item.getItemId()) {
  case 1:
   juso = "http://myfot.iptime.org";
   return true;
  case 2:
   juso = "http://192.168.43.136";
   return true;
  case 3:
   juso = "http://myfot.iptime.org";
   return true;
  case 4:
   juso = "http:/192.168.43.136";
   return true;
  }
  return false;
 }

 class DownThread extends Thread {
  String mAddr;
  String line; // 습도값을 저장할 line
  int supdo = 0;

  DownThread(String addr) {
   mAddr = addr;

  }

  public void run() {// 값 읽어오는 스레드 실행
   StringBuilder html = new StringBuilder();
   try {

    URL url = new URL(mAddr);
    HttpURLConnection conn = (HttpURLConnection) url
      .openConnection();
    if (conn != null) { // 커넥트가 제대로 됐을때
     conn.setConnectTimeout(10000);
     conn.setUseCaches(false);
     if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
      BufferedReader br = new BufferedReader(
        new InputStreamReader(conn.getInputStream()));
      for (int i = 0; i < 4; i++) {
       line = br.readLine();

      }
      br.close();

      //

     }
     

     conn.disconnect();
    }

   } catch (Exception ex) {
    mAfterDown2.sendEmptyMessage(0);
   }
   mAfterDown.sendEmptyMessage(0);

  }
 }

 Handler mAfterDown = new Handler() {// 핸들러
  public void handleMessage(Message msg) {
   mProgress.dismiss();
   TextView result2 = (TextView) findViewById(R.id.textView1);
   result2.setText(mThread.line);
   mThread.supdo = Integer.parseInt(mThread.line);

   @SuppressWarnings("unused")
   RatingBar rating = (RatingBar) findViewById(R.id.ratingBar1);

   // 각 습도별 레이팅 바 설정
   if (mThread.supdo > 700) {
    rating.setRating((float) 5.0);

   } else if (mThread.supdo > 625) {
    rating.setRating((float) 4.5);

   } else if (mThread.supdo > 550) {
    rating.setRating((float) 4.0);

   } else if (mThread.supdo > 475) {
    rating.setRating((float) 3.5);

   } else if (mThread.supdo > 400) {
    rating.setRating((float) 3.0);

   } else if (mThread.supdo > 325) {
    rating.setRating((float) 2.5);
    
   } else if (mThread.supdo > 250) {    
    rating.setRating((float) 2.0);
    
   } else if (mThread.supdo > 175) {
    rating.setRating((float) 1.5);
    
   } else if (mThread.supdo > 100) {
    rating.setRating((float) 1.0);
    
   } else if (mThread.supdo > 50) {
    rating.setRating((float) 0.5);
    
   } else {
    rating.setRating((float) 0);
    
   }





  }
 };
 Handler mAfterDown2 = new Handler() {// 핸들러
  public void handleMessage(Message msg) {
   Toast.makeText(getApplicationContext(), "내친구 화분을 켜주세요",
     Toast.LENGTH_LONG).show();
   // try {
   // Thread.sleep(100000);
   // finish();
   // } catch (InterruptedException e) {
   // e.printStackTrace();
   // }
  }
 };
}

긴 질문 읽어주셔서 감사합니다

답변 감사히 받겠습니다 

 

nalda (230 포인트) 님이 2013년 6월 4일 질문

2개의 답변

0 추천

아마  conn.getInputStream() 이부분에서 예외 발생하고 죽을꺼에요

스스로 해결하기 위해서 로그캣을 확인하는 습관을 들이시고

위에 해당하는 부분을 try catch 로 묶으시면 죽는사태(?) 는 막으실 수 있습니다.

더 나아가서 추후에는 실제 유효한 ip 만 메뉴에 띄워주는게 더 편리하겠죠 ?

유효성 체크를 먼저 한다음에 말이지요~

블랙넥원 (9,600 포인트) 님이 2013년 6월 5일 답변
0 추천
데이터를 받는 부분에서 예외처리 해주시구요..

connectTimeoutException 처리를 해주세요! 그럼 서버가 죽어있다면 null 값이 넘어올겁니다.

이 부분을 메시지라든지 처리해주시면 될듯합니다.
안드로메다개발자 (8,830 포인트) 님이 2013년 6월 5일 답변
...