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

공공데이터 API 파싱관련 질문입니다.

0 추천

 private String getXml(String strUrl){
        StringBuffer sb = new StringBuffer();
        URL u;
        HttpURLConnection uc;

        InputStream is = null;
        InputStreamReader isr = null;
        BufferedReader br = null;
        try{
            u = new URL(strUrl);
            uc = (HttpURLConnection) u.openConnection();
            if(uc != null){
                uc.setConnectTimeout(5000);
                uc.setUseCaches(false);
                if(uc.getResponseCode() == HttpURLConnection.HTTP_OK){
                    is = uc.getInputStream();
                    isr = new InputStreamReader(is, "utf-8");
                    br = new BufferedReader(isr);
                    String line= "";
                    while((line = br.readLine()) != null){
                        sb.append(line + "\n");
                    }
                }
                uc.disconnect();
            }
            return sb.toString();
        }catch(Exception e){
            showMsg(e.toString());
            return "";
        }finally{
            try{
                if( br != null) br.close();
                if( isr != null) isr.close();
                if( is != null) is.close();
            }catch(IOException ie){}
        }
    } // end getXml()

현재 위의 코드로 공공데이터API를 얻어오고 있습니다. 이부분을 onCreate()에서 쓰레드를 만들어서 사용하고 있는데 맞는건가요??

에러가 뜰때가 있고 안뜰때가 있습니다. 핸들러를 사용해야한다는 말씀도 있고 하는데 해결이 잘 안되네요. 혹시 이부분에 대해서 아시는분이 계신다면 답변해주시면 정말 감사하겠습니다.

 

신상혁 (490 포인트) 님이 2016년 8월 4일 질문

1개의 답변

0 추천
네트워크가 들어가는 부분은 메인 쓰레드에서 돌릴수 없습니다.

AsyncTask나 Thread/Handler를 사용하셔야 합니다.

 

https://developer.android.com/reference/android/os/AsyncTask.html

위 안드로이드 사이트에 가보시면 알겠지만 AsyncTask는 기본적으로

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {

         protected Long doInBackground(URL... urls) {

             int count = urls.length;

             long totalSize = 0;

             for (int i = 0; i < count; i++) {

                 totalSize += Downloader.downloadFile(urls[i]);

                 publishProgress((int) ((i / (float) count) * 100));

                 // Escape early if cancel() is called

                 if (isCancelled()) break;

             }

             return totalSize;

         }

 

         protected void onProgressUpdate(Integer... progress) {

             setProgressPercent(progress[0]);

         }

 

         protected void onPostExecute(Long result) {

             showDialog("Downloaded " + result + " bytes");

         }

     }

 

이런 식으로 구성되어있고 doInBackground에서 네트워크 등 백그라운드 작업을 하시면 되고

onPostExecute 여기서 결과값을 전달받아 UI를 업데이트 하시면 됩니다.

자세한 사용법은 위 사이트에 나와있습니다.

 

그리고 쓰레드 핸들러 같은 경우는

Thread를 만들고 Runnable을 구현해서 러너블에서 네트워크 작업 등 백그라운드 작업을 하시면 되고

Handler의 메시지 객체로 전달해서 Handler에서 UI 처리를 하시면 됩니다.

 

두개가 구현하는 방식이 달라서 그렇지 똑같습니다.

일단 예제는 넘쳐나니.. 공부해 보시고 적용하세요.
캬옹이 (37,920 포인트) 님이 2016년 8월 4일 답변
...