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

html파싱할때 progressbar 사용에 대해서 질문이요 ㅠㅠ

0 추천

제가지금 html파싱을 해서 데이터를 불러와서

리스트뷰에 넣었습니다.

리스트뷰는 커스텀리스트뷰 이고요,

그게 Fragment 안에 들어가있습니다.

public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState){

이렇게 onCreateView 밑에 데이터를 파싱해서 뽑아오는데

(저는 앱이 실행될때 바로 화면에 뿌려주기 위해)

Runnable task = new Runnable() {

    @Override
    public void run() {
        getImgLink(url);
        getOpenday(url);
        getData(url);
        getOpenMovday(url);
        getPeoples(url);
        getMoney(url);
        getLink(url);
    }

};

thread = new Thread(task);
thread.start();


try {
    thread.join();


} catch (Exception e) {

}

이런식으로해서 데이터를 파싱해서 뿌려줍니다.

근데 여기서 파싱하는동안 로딩이 좀걸리더군요(한3초?)

그동안 Progressbar를 써서 로딩중이라고 표시하고싶은데..

일단 핸들러를 사용해서 고쳐보기도 하고,

수없이 고쳐봤는데 ㅠㅠ 에러나거나

아니면 Progressbar가 나타나질 않네요 ㅠㅠㅠ

어떻게 수정할수 있는 방법 없을까요?

 

익명사용자 님이 2015년 12월 15일 질문

1개의 답변

0 추천
Thread 에서는 UI를 컨트롤 할수가 없습니다.

그래서 thread를 시작하기전에 프로그레스바를 표시해주고

작업이 끝난 후에는 Handler를 사용해서 신호를 주고 그 handler에서 프로그레스바를 숨기는 식으로 하시면될 것같습니다.
캬옹이 (37,920 포인트) 님이 2015년 12월 15일 답변
흠..ㅠㅠ
일단 말씀하신대로 제가
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState){
        progressDialog = new ProgressDialog(getActivity());
        progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        progressDialog.setMessage("로딩중");
        progressDialog.show();

이렇게 thread가 시작하기전에 프로그레스바를 표시해주고
Runnable task = new Runnable() {

            @Override
            public void run() {
                getImgLink(url);
                getOpenday(url);
                getData(url);
                getOpenMovday(url);
                getPeoples(url);
                getMoney(url);
                getLink(url);

                confirmHandler.sendEmptyMessage(1);

            }

        };

        thread = new Thread(task);
        thread.start();

        try {
            thread.join();


        } catch (Exception e) {

        }

여기서 핸들러로 신호를 줬습니다.
그리고 핸들러에서 받아와서

private Handler confirmHandler = new Handler(){
      @Override
      public void handleMessage(Message msg){
          if (msg.what==1){
              Toast.makeText(getActivity(), "첫번째 데이터를 받아왔습니다.", Toast.LENGTH_SHORT).show();
              progressDialog.dismiss();
          }
      }
    };

이렇게해서 프로그레스바를 없애고, toast로 데이터를 다 받아온걸 확인을 합니다.

그런데 이렇게 할 경우 제가 보니
당연히 오류는 안납니다
그치만 프로그레스바가 나오질 않습니다.
그이유를 알아보니
이 화면(즉 해당되는 Fragment ) 이 실행될때 html파싱을 먼저 다 한후에
화면을 표시해버립니다.....
즉 제가원하는건
데이터를 받아오는동안 프로그레스바를 실행시키는건데
여기서는 화면이 나오기전에 데이터를 받아와버리고
(그동안은 잠시멈춥니다.. 데이터받는시간)
다 받아오면 화면을 보여주는 프로그레스바가 보일 시간이 없는겁니다...ㅠㅠ

지금 탭이 4개로 구성되어 있는데
탭1에만 파싱을 해놨습니다.
탭4에서 탭1을 클릭해서 넘어갈때도
역시나 화면이 잠깐 멈추고 데이터를 다 파싱해온뒤에
해당화면으로 넘어갑니다...
이러니 프로그레스바가 보일지 않습니다....
(화면이 뜨는순간은 이미 데이터를 다 받아왔기 때문에 프로그레스바를 종료합니다.)

제가 원하는건 화면이 먼저뜨고난뒤 데이터를 받아오고 그시간동안 프로그레스바는 동작하고 데이터를 다 받아오면 프로그레스바를 종료하는겁니다...ㅠㅠ

설명이 길었는데 어떻게 안될까요?ㅠㅠ
힘드네요 ㅠㅠ
...