기초가 다져지지 않은 안드로이드 개발자 초보입니다...

 

제가 어찌 어찌 하다보니 구현된 앱이 하나 있는데요.

 

구조가..

 


public class RootNormalActivity extends Activity {

 

... (생략)...


 protected XmlPaseResult createXmlPaser(String strXmlUrl, String strParams, String strMethod) {
  HttpURLConnection conn = null;

  strXmlUrl = "http://" + getString(R.string.app_domain) + strXmlUrl;
  XmlPaseResult xmlPaseResult = new XmlPaseResult();
     try {
      
      URL url;
         if (strMethod == "POST") {
       
          String resultHmac = CommUtil.createURLHmac(strXmlUrl);
          
          ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
          NetworkInfo ni = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
          boolean isWifiConn = ni.isConnected();
          ni = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
          boolean isMobileConn = ni.isConnected();
       
          if(!isWifiConn && !isMobileConn) {
              xmlPaseResult.setError(-200, "WIPI망 또는 3/4G망 접속상태가 원활하지 않습니다."); // 에러발생
              return xmlPaseResult;
          }
          
       if (strXmlUrl.indexOf("?") != -1) strXmlUrl += "&hmac=" + resultHmac;
       else  strXmlUrl += "?hmac=" + resultHmac;
       url = new URL("strXmlUrl);
       
             conn = (HttpURLConnection)url.openConnection();
       conn.setDoOutput(true);       
             conn.setConnectTimeout(30000);
             conn.setReadTimeout(30000);
             conn.setUseCaches(false);
             conn.setRequestMethod("POST");

          OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
          wr.write(strParams);
          wr.flush();
         }
         else {
          strXmlUrl = strXmlUrl + "?" + strParams;
          String resultHmac = CommUtil.createURLHmac(strXmlUrl);
          
          ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
          NetworkInfo ni = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
          boolean isWifiConn = ni.isConnected();
          ni = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
          boolean isMobileConn = ni.isConnected();
       
          if(!isWifiConn && !isMobileConn) {
              xmlPaseResult.setError(-200, "WIPI망 또는 3/4G망 접속상태가 원활하지 않습니다."); // 에러발생
              return xmlPaseResult;
          }
          
       if (strXmlUrl.indexOf("?") != -1) strXmlUrl += "&hmac=" + resultHmac;
       else  strXmlUrl += "?hmac=" + resultHmac;
       url = new URL("strXmlUrl);
       
             conn = (HttpURLConnection)url.openConnection();
             conn.setConnectTimeout(10000);
             conn.setReadTimeout(10000);
             conn.setUseCaches(false);
             conn.setRequestMethod("GET");
         }
   Log.i("TAG", "CALL URL -----> " + strXmlUrl);
         
         // 요청이 정상적으로 전달되었으면 HTTP_OK(200)
         // URL이 발견되지 않으면 HTTP_NOT_FOUND(404)
         // 인증에 실패하면 HTTP_UNAUTHORIZED(401)
         int n4ResCode = conn.getResponseCode();
         if (n4ResCode != HttpURLConnection.HTTP_OK) {
          xmlPaseResult.setError(-95, "URL 접근중 오류가 발생하였습니다. (" + n4ResCode + ")"); // 에러발생
          return xmlPaseResult;
         }
      
   XmlPullParserFactory parserCreator = XmlPullParserFactory.newInstance();
   XmlPullParser parser = parserCreator.newPullParser();
   parser.setInput(conn.getInputStream(), null);
   
      int parserEvent = parser.getEventType();
      String tag = "";
   
   ArrayList<Hashtable<String, String>> hashXmlList = new ArrayList<Hashtable<String,String>>();
   Hashtable<String, String> hashXmlInfo = new Hashtable<String, String>();
   
      boolean isList = false;
      boolean isTextAdd = false;
   Hashtable<String, String> htListNode = new Hashtable<String, String>();
   while (parserEvent != XmlPullParser.END_DOCUMENT ){
    switch(parserEvent){
    case XmlPullParser.TEXT:
        if (isTextAdd) {
         if (isList) {
          if(htListNode.containsKey(tag)) {
           hashXmlList.add(htListNode);
           htListNode = new Hashtable<String, String>();
              htListNode.put(tag, parser.getText());
             }
             else {
              htListNode.put(tag, parser.getText());
             }
         }
         else {
          hashXmlInfo.put(tag, parser.getText());
         }
     }
     break;
    case XmlPullParser.END_TAG:
     tag = parser.getName();
     isTextAdd = false;
     break;
    case XmlPullParser.START_TAG:
     tag = parser.getName();
     if (tag.compareTo("LIST") == 0) isList = true;     
     isTextAdd = true;
     break;
    }
    parserEvent = parser.next();
   }
   
   if (htListNode.size() > 0) {
    hashXmlList.add(htListNode);
   }
   
   xmlPaseResult.hashXmlInfo = hashXmlInfo;
   xmlPaseResult.hashXmlList = hashXmlList;
   xmlPaseResult.setSuccess(); // 정상

      return xmlPaseResult;
     }
     catch (UnknownHostException e) {
      xmlPaseResult.setError(-96, "호스트 접속 오류, 다시 시도하세요."); // 에러발생
      return xmlPaseResult;
     }
     catch (SocketTimeoutException e) {
      xmlPaseResult.setError(-97, "접속이 지연되고 있습니다. 잠시후 다시 시도하세요."); // 에러발생
      return xmlPaseResult;
     }
     catch (FileNotFoundException e) {
      xmlPaseResult.setError(-98, "서버 점검중입니다."); // 에러발생
      return xmlPaseResult;
     }
     catch (MalformedURLException e) {
      xmlPaseResult.setError(-99, "잘못된 URL 형식입니다."); // 에러발생
      return xmlPaseResult;
     }
     catch (Exception e) {
      xmlPaseResult.setError(-100, "알수없는 오류 : " + e.toString()); // 에러발생
      return xmlPaseResult;
     }
     finally {
      if (conn != null) conn.disconnect();
     }
 } 

 

... (생략)...

 

}

 

위 와 같은 형태의 클래스를 상속받아 각각의 액티비티를 생성하는 형태인데요..

 

다른 어플들에 비해 유난히도 로딩속도가 지연되는 경우가 자주 발생합니다..

 

예를들어 어플을 완전 종료하지 않고 약 1시간 가량 놔뒀다가 다시 사용하는 시점에서 다른 액티비티로 이동하게 될라치면 한참동안 접속을 시도하다가 네트웍 접속 상태가 좋지 않다며 종료되버리는 경우가 허다하고.. 다른 경우로는 앱을 사용하는 도중에 3G에서 와이파이로 변경한 후에 다른 액티비티로 이동해서 새로운 API를 호출하는 시점에 접속이 지연된다든디..

 

좀 많이 답답한 상황이 오곤 합니다.

 

한 두번이면 네트웍 상태가 불안정해서 그런가 보다~ 하고 넘어갈 수도 있겠는데..

 

이건 뭐 한 두번도 아닌 상황이라서요..

 

저 구조상에 뭔가 문제가 있는게 보이시나요..?

 

아니면 액티비티가 상속받는 형태 자체가 문제가 있어서 그런걸까요..

 

어떤 답변이든 부탁드립니다...

 

힌트라도 감사드릴것 같네요.. 이게 하루 이틀 지난 문제가 아닌지라..

 

해결책이 안보여서요..

 

다시 처음부터 로직을 구성할 수 있는 상황도 아니고..

 

도움이 될만한 어떤 답변이라도 꼭 좀 부탁드립니다.

 

아니, 말도 안된다 생각되는 어떠한 대답이라도.. 원합니다..

 

(※ 참고로 웹상에서 직접 API URL을 호출해보면 그리 느린 상황도 아닌게 확실하거든요.. 유난히 앱 상에서 호출하는 시점에서만 느려집니다..)