안드로이드 asynctask 활용 질문드립니다.

조회수 2146회

제가 안드로이드와 php통신을 통해서 mysql db내용을 리스트형식으로 가져오는 예제를 만들고 있습니다.

액티비티 실행시에 다음과 같은 AsyncTask들을 돌려서 php통신을 하여 데이터를 가져오고, 리스트뷰에 나타내게 됩니다.

private void getDatas(){
    class getTask extends AsyncTask<String,Void,String>{

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            Toast.makeText(MainActivity.this, "get Datas", Toast.LENGTH_SHORT).show();
        }

        @Override
        protected String doInBackground(String... params) {
            try{

                URL url1 = new URL("http://rkdanswns.esy.es/wju/answers.php");
                URL url = new URL("http://rkdanswns.esy.es/wju/problems.php");

                HttpURLConnection mUrlConnection = (HttpURLConnection) url.openConnection();
                HttpURLConnection mUrlConnection1 = (HttpURLConnection) url1.openConnection();

                mUrlConnection.setDoInput(true);
                mUrlConnection1.setDoInput(true);

                BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream(), Charset.forName("UTF-8")));
                while(true){
                    final String line = reader.readLine();
                    if(line==null){
                        break;
                    }else{
                        word = line.split("<br>");
                        Log.e("ee",line);
                    }

                    if(isCancelled()){
                        break;
                    }
                }

                BufferedReader reader1 = new BufferedReader(new InputStreamReader(url1.openStream(), Charset.forName("UTF-8")));
                while(true){
                    final String line = reader1.readLine();
                    if(line==null){
                        break;
                    }else{
                        answer = line.split("<br>");
                    }

                    if(isCancelled()){
                        break;
                    }
                }

                cancel(true);
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    }

    getTask get = new getTask();
    get.execute();

}

public void show(){
    class dataToList extends AsyncTask<String,Void,String>{

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);

            data = new ArrayList<>();
            for(int i=0; i<word.length; i++){
                ListViewItem item = new ListViewItem(word[i],answer[i]);
                data.add(item);
            }
            adapter = new ListViewAdapter(MainActivity.this,R.layout.listview_item,data);
            wordList.setAdapter(adapter);

        }

        @Override
        protected String doInBackground(String... params) {
            return null;
        }
    }
    dataToList list = new dataToList();
    list.execute();
}

다음과 같이 db를 adding하기 위해서 add버튼을 하나 만들었고, data를 adding하고나서 리스트뷰를 다시 불러오기 위해서 refresh란 버튼 하나를 만들었습니다.

Button refresh;
Button add;



        add.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(MainActivity.this,addingActivity.class);
            startActivityForResult(intent,1);
        }
    });

add버튼 클릭시에 add를 하는 엑티비티로 이동을 하게 됩니다.

액티비티에서 두개의 editText를 통해서 값을 입력받고 메인으로 돌아오게되고, 입력값을 가져와서 다음과 같이 AsyncTask를 통해서 php에 값을 전송하여 데이터를 db안에 추가하게 됩니다.

private void addProblem() {
    class addTask extends AsyncTask<Void, Void, String> {

        @Override
        protected String doInBackground(Void... params) {
            try {

                w = URLEncoder.encode(w, "UTF-8");
                a = URLEncoder.encode(a, "UTF-8");

                URL url = new URL("http://rkdanswns.esy.es/wju/addProblem.php?problem=" + w + "&mean=" + a);
                HttpURLConnection mUrlConnection = (HttpURLConnection) url.openConnection();
                mUrlConnection.setDoInput(true);

                BufferedReader br = null;
                StringBuilder sb = new StringBuilder();
                InputStream is = new BufferedInputStream(mUrlConnection.getInputStream());

                String line;
                while (true) {
                    br = new BufferedReader(new InputStreamReader(is));
                    while ((line = br.readLine()) != null) {
                        sb.append(line);
                        Log.i("request info ", line);
                    }

                    if(isCancelled()) {
                        Toast.makeText(MainActivity.this, "inputted", Toast.LENGTH_SHORT).show();
                        break;
                    }
                }
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            cancel(true);
        }
    }
    addTask task = new addTask();
    task.execute();
}

추가를 하게 되고, 추가된내용과 같이 리스트뷰에 나타내기 위해서 update겸 refresh 버튼을 누르게 됩니다. refresh버튼을 누르면

private void getDatas(){
    class getTask extends AsyncTask<String,Void,String>{

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            Toast.makeText(MainActivity.this, "get Datas", Toast.LENGTH_SHORT).show();
        }

        @Override
        protected String doInBackground(String... params) {
            try{

                URL url1 = new URL("http://rkdanswns.esy.es/wju/answers.php");
                URL url = new URL("http://rkdanswns.esy.es/wju/problems.php");

                HttpURLConnection mUrlConnection = (HttpURLConnection) url.openConnection();
                HttpURLConnection mUrlConnection1 = (HttpURLConnection) url1.openConnection();

                mUrlConnection.setDoInput(true);
                mUrlConnection1.setDoInput(true);

                BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream(), Charset.forName("UTF-8")));
                while(true){
                    final String line = reader.readLine();
                    if(line==null){
                        break;
                    }else{
                        word = line.split("<br>");
                        Log.e("ee",line);
                    }

                    if(isCancelled()){
                        break;
                    }
                }

                BufferedReader reader1 = new BufferedReader(new InputStreamReader(url1.openStream(), Charset.forName("UTF-8")));
                while(true){
                    final String line = reader1.readLine();
                    if(line==null){
                        break;
                    }else{
                        answer = line.split("<br>");
                    }

                    if(isCancelled()){
                        break;
                    }
                }

                cancel(true);
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    }

    getTask get = new getTask();
    get.execute();

}

public void reShow(){
    class dataToList extends AsyncTask<String,Void,String>{

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);

            data = new ArrayList<>();
            for(int i=0; i<word.length; i++){
                ListViewItem item = new ListViewItem(word[i],answer[i]);
                data.add(item);
            }
            adapter = new ListViewAdapter(MainActivity.this,R.layout.listview_item,data);
            wordList.setAdapter(adapter);

            cancel(true);
        }

        @Override
        protected String doInBackground(String... params) {
            return null;
        }
    }
    dataToList list = new dataToList();
    list.execute();
}

다음과 같은 메소드를 통해서 리스트뷰가 업데이트가 되어야하는데, 다음과 같은 로그가뜨면서 업데이트가 안됩니다.

12-28 02:48:13.161 10172-10187/com.example.cracking.problemeditor I/art: Background sticky concurrent mark sweep GC freed 3419(5MB) AllocSpace objects, 488(7MB) LOS objects, 29% free, 19MB/27MB, paused 2.950ms total 107.414ms

12-28 02:48:15.441 10172-10187/com.example.cracking.problemeditor W/art: Suspending all threads took: 9.508ms

12-28 02:48:15.441 10172-10187/com.example.cracking.problemeditor I/art: Background sticky concurrent mark sweep GC freed 434(768KB) AllocSpace objects, 62(992KB) LOS objects, 30% free, 18MB/26MB, paused 10.439ms total 18.610ms

add버튼을 통해서 추가하지 않고, phpMyadmin을 통해서 data를 추가하고 refresh버튼을 눌렀을 때 경우에는 리스트뷰가 업데이트가 되어 잘뜹니다.

혹시 제가 스레드 사용을 잘못해서 오류가 발생한 건가요?? 그리고 어떤방식으로 스레드처리를 해야 원활하게 통신을 할 수 있을까요..? 꼭좀 부탁드립니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)