안녕하세요.

저는 지금 Thread 개념이 이해가 되지 않아서 이것저것 만들어 보다가 도움을 받고자 글을 올립니다.

ProgressBar나 또는 단순히 특정 TextView에 변경을 가하고자 합니다.

버튼 클릭시 TextView의 글자를 변경하는 것이나 ProgressBar의 값을 변경하는 것은 가능합니다.

근데, 버튼 클릭시 for문을 돌려서 반복 수행할 경우 최종 마지막만 적용이 됩니다.

--------------------------------------------------------------------------------------------------------------------------------------------------------------
 //- Member 변수
 private ProgressBar  mPB;
 private Button   mOnceBTN, mForBTN;
 private int    mValue=0;


 protected void onCreate(Bundle savedInstanceState) {
  
       super.onCreate(savedInstanceState);
       setContentView(R.layout.thread_ex01);
  
       mPB = (ProgressBar)findViewById(R.id.ProgressBar01);
       mPB.setMax(100);  

       mOnceBTN = (Button) findViewById(R.id.onceBTN);
       mOnceBTN.setOnClickListener(this);
  
       mForBTN = (Button) findViewById(R.id.forBTN);
       mForBTN.setOnClickListener(this);
 }

public void onClick(View v) {
  
     switch(v.getId())
     {
        case  R.id.onceBTN:
                   mValue+=10;
                   mPB.setProgress(mValue);
                   break;
    
        case   R.id.forBTN:
                    for(int idx=0; idx<= 100; idx+=10)
                    {
                         Log.i(TAG, "PB " + idx);

                        mPB.setProgress(idx);
                        SystemClock.sleep(1000);
                  }
                  break;
      }
 }
--------------------------------------------------------------------------------------------------------------------------------------------------------------

왜 마지막 결과만 화면에 즉, progressBar에 적용이 되나요?

그래서 현재 thread 즉, MainThread에 메시지를 보내면 되지 않을까 해서 해 보았습니다.
아래 코드처럼요.. 그런데 결과는 동일하게 최종 마지막 경우만 적용이 됩니다.

--------------------------------------------------------------------------------------------------------------------------------------------------------------
//- Member 변수 추가
 private Handler   mMainHandler;

 protected void onCreate(Bundle savedInstanceState) {
  
       super.onCreate(savedInstanceState);
       setContentView(R.layout.thread_ex01);
  
       mPB = (ProgressBar)findViewById(R.id.ProgressBar01);
       mPB.setMax(100);  

       mOnceBTN = (Button) findViewById(R.id.onceBTN);
       mOnceBTN.setOnClickListener(this);
  
       mForBTN = (Button) findViewById(R.id.forBTN);
       mForBTN.setOnClickListener(this);

      mPBThreadBTN = (Button) findViewById(R.id.pbThreadBTN);
      mPBThreadBTN.setOnClickListener(this);


      mMainHandler = new Handler(){

             @Override
             public void handleMessage(Message msg) {
                            Log.i(TAG, "handleMessage()");
                           mPB.incrementProgressBy(10);
                 }
      };
 }


public void onClick(View v) {
  
     switch(v.getId())
     {
        case  R.id.onceBTN:
                   mValue+=10;
                   mPB.setProgress(mValue);
                   break;
    
        case   R.id.forBTN:
                    for(int idx=0; idx<= 100; idx+=10)
                    {
                         Log.i(TAG, "PB " + idx);

                        // mPB.setProgress(idx);
                        mMainHandler.sendMessage(mMainHandler.obtainMessage());
                        SystemClock.sleep(1000);
                  }
                  break;


      }
 }

=> LogCat 결과
    thread_logcat.JPG 
=> 메시지를 10번 다 보내고 나서 한꺼번에 handler에서 처리하고 있습니다.
--------------------------------------------------------------------------------------------------------------------------------------------------------------

원래 이런건지요??
원래 이런것인지 아니면 제가 코드를 잘못 짜서 동일 thread에 메시지 보내는 것이 제대로 동작안하는 것인지 궁금합니다.


그런데 다른 thread를 하나 생성해서 반복문에서 thread를 보내면 정상적으로 동작을 합니다.
--------------------------------------------------------------------------------------------------------------------------------------------------------------
//- Member 변수 추가
 private Button   mOnceBTN, mForBTN, mPBThreadBTN;


 protected void onCreate(Bundle savedInstanceState) {
  
       super.onCreate(savedInstanceState);
       setContentView(R.layout.thread_ex01);
  
       mPB = (ProgressBar)findViewById(R.id.ProgressBar01);
       mPB.setMax(100);  

       mOnceBTN = (Button) findViewById(R.id.onceBTN);
       mOnceBTN.setOnClickListener(this);
  
       mForBTN = (Button) findViewById(R.id.forBTN);
       mForBTN.setOnClickListener(this);

      mPBThreadBTN = (Button) findViewById(R.id.pbThreadBTN);
      mPBThreadBTN.setOnClickListener(this);


      mMainHandler = new Handler(){

             @Override
             public void handleMessage(Message msg) {
                            Log.i(TAG, "handleMessage()");
                           mPB.incrementProgressBy(10);
                 }
      };

 }

public void onClick(View v) {
  
     switch(v.getId())
     {
        case  R.id.onceBTN:
                   mValue+=10;
                   mPB.setProgress(mValue);
                   break;
    
        case   R.id.forBTN:
                    for(int idx=0; idx<= 100; idx+=10)
                    {
                         Log.i(TAG, "PB " + idx);

                        // mPB.setProgress(idx);
                        mMainHandler.sendMessage(mMainHandler.obtainMessage());
                        SystemClock.sleep(1000);
                  }
                  break;

      case   R.id.pbThreadBTN:
                  Thread pbThread = new Thread(){
                         @Override
                         public void run() {
                                  try {
                                               for(int idx=0; idx<= 100; idx+=10)
                                              {
                                                   Log.i(TAG + "pbThread : ", "PB - " + idx);
                                                   mMainHandler.sendMessage(mMainHandler.obtainMessage());
                                                   Thread.sleep(1000);
                                              }
                                } catch (InterruptedException e) {
                                              e.printStackTrace();
                                 }
                         } };
              pbThread.start();
              break;

      }
 }

=> LogCat 결과
     thread_logcat02.jpg
=> 다른 thread에서 MainThread에 메시지를 보낼 경우는 정상 동작
--------------------------------------------------------------------------------------------------------------------------------------------------------------


제가 이해하기로는 MainUI Thread에서 사용자의 요청이나 액션에 5초 이내 응답을 해 주기 위해서,
오래 걸리는 작업은 다른 Thread를 생성해서 처리하는 것으로 이해를 했습니다.

하지만, 지금의 경우는 사용자 요청에 대한 응답과 상관 없이 반복문에서의 UI 요소에 업데이트 작업입니다.

아님, UI 요소에 invalidate를 줘야 하나요???

좀 알려 주십시요.