IT일반

안드로이드앱 개발일지 - 콩콩데이터, 로딩 다이얼로그의 대체

톰이야요 2024. 7. 31. 08:00

그동안 앱의 로딩화면은 다이얼로그를 이용해서 화면에 뿌려 주었다. 그러다보니 디자인과 기능의 변경이 어려워서 만족스럽지 않았지만 그대로 두고 사용했다. 이제 ChatGPT가 있으니, 이런 고민되는 부분을 쉽게 개선가능하다.

 

기존의 코드는 아래와 같다.

private class MyAsyncTask extends AsyncTask<URL, Void, String> {

        @Override
        protected void onPreExecute() {
            Log.d("KONG_MAIN", "onPreExecute");

            asyncDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);

            String str = m_bundle.getString("SELECT");
            boolean b = str.startsWith("khnp");


            if (m_bundle.getString("SELECT").startsWith("khnp")) {
                asyncDialog.setMessage("공공데이터를 가져오는 중입니다..." + System.getProperty("line.separator") +"한국수력원자력 API는 30초 이상 소요될 수 있습니다.");
            }
            else
            {
                asyncDialog.setMessage("공공데이터를 가져오는 중입니다...");
            }
            asyncDialog.show();
            super.onPreExecute();
        }

        ProgressDialog asyncDialog = new ProgressDialog(MainActivity.this);

        @Override
        protected void onProgressUpdate(Void... values) {
            Log.d("KONG_MAIN", "onProgressUpdate");
            super.onProgressUpdate(values);
        }

        @Override
        protected String doInBackground(URL... urls) {
            Log.d("KONG_MAIN", "doInBackground");
            if (m_bundle.getString("SELECT") == "customs_tradestat") //공공데이터 GW API 서비스에 해당함
            {
                m_apicall.CallAPI_Json(urls[0]);
            }
            else
            {
                m_apicall.CallAPI(urls[0]);
            }

            try {
                Thread.sleep(1000);
            }
            catch (Exception e) {
                e.printStackTrace();
            }
            return m_apicall.GetResult();
        }

        @Override
        protected void onPostExecute(String result) {
            Log.d("KONG_MAIN", "onPostExecute");

            if (m_bundle.getString("SELECT") == "none" || m_bundle.getString("SELECT") == "keco_airpollution")
            {
                m_strData = "none";
            }
            else
            {
                m_strData = result;
            }

            if(asyncDialog.isShowing()) asyncDialog.dismiss();

            ChangeFragment();

            super.onPostExecute(result);
        }

        @Override
        protected void onCancelled() {
            super.onCancelled();

            if(asyncDialog.isShowing()) asyncDialog.dismiss();

            Toast.makeText(getApplicationContext(), "호출이 최소되었습니다.", Toast.LENGTH_LONG).show();
        }
    }

 

 

이제 레이아웃에 로딩화면을 정의해두고,

 

아래와 같이 호출해서 사용할 수 있다.

private class MyAsyncTask extends AsyncTask<URL, Void, String> {

        @Override
        protected void onPreExecute() {
            Log.d("KONG_MAIN", "onPreExecute");

            String str = m_bundle.getString("SELECT");
            boolean b = str.startsWith("khnp");


            if (m_bundle.getString("SELECT").startsWith("khnp")) {
                showLoading("공공데이터를 가져오는 중입니다..." + System.getProperty("line.separator") +"한국수력원자력 API는 30초 이상 소요될 수 있습니다.");
            }
            else
            {
                showLoading("공공데이터를 가져오는 중입니다...");
            }
            super.onPreExecute();
        }

        @Override
        protected void onProgressUpdate(Void... values) {
            Log.d("KONG_MAIN", "onProgressUpdate");
            super.onProgressUpdate(values);
        }

        @Override
        protected String doInBackground(URL... urls) {
            Log.d("KONG_MAIN", "doInBackground");
            if (m_bundle.getString("SELECT") == "customs_tradestat") //공공데이터 GW API 서비스에 해당함
            {
                m_apicall.CallAPI_Json(urls[0]);
            }
            else
            {
                m_apicall.CallAPI(urls[0]);
            }

            try {
                Thread.sleep(1000);
            }
            catch (Exception e) {
                e.printStackTrace();
            }
            return m_apicall.GetResult();
        }

        @Override
        protected void onPostExecute(String result) {
            Log.d("KONG_MAIN", "onPostExecute");

            if (m_bundle.getString("SELECT") == "none" || m_bundle.getString("SELECT") == "keco_airpollution")
            {
                m_strData = "none";
            }
            else
            {
                m_strData = result;
            }

            hideLoading();

            ChangeFragment();

            super.onPostExecute(result);
        }

        @Override
        protected void onCancelled() {
            super.onCancelled();

            hideLoading();

            Toast.makeText(getApplicationContext(), "호출이 최소되었습니다.", Toast.LENGTH_LONG).show();
        }
    }

 

 

이제 로딩은 끝!