developer tip

post 메소드는 정확히 무엇을합니까?

copycodes 2020. 8. 28. 07:35
반응형

post 메소드는 정확히 무엇을합니까?


나는 매우 이상한 기능을 만났습니다.

메인 스레드에서 애니메이션을 실행하려고하면 시작되지 않습니다. 내가 말한 애니메이션을 실행할 때

getView().post(new Runnable() {
            @Override
            public void run() {
                getView().startAnimation(a);
            }
        });

시작합니다.

나는 CurrentThread애니메이션을 시작하기 전에를 인쇄했고 둘 다 인쇄했습니다 main.

분명히 여기에 뭔가 빠졌는데 둘 다 메인 스레드에서 애니메이션을 시작해야하기 때문입니다 ... 내 생각 엔 포스트가 작업을 대기열에 추가 할 때 더 "정확한 시간"에 시작된다는 것입니다.하지만 알고 싶습니다. 여기서 더 깊이있는 일이 발생합니다.

편집 : 정리해 보겠습니다-내 질문은 왜 포스트에서 애니메이션을 시작하면 메인 스레드에서 애니메이션을 시작하면 시작되지 않는지입니다.


post : post는 Runnable이 메시지 대기열에 추가되도록합니다.

Runnable : 실행할 수있는 명령을 나타냅니다. 종종 다른 스레드에서 코드를 실행하는 데 사용됩니다.

run () : 클래스 코드의 활성 부분 실행을 시작합니다. 이 메서드는 Runnable을 구현하는 클래스로 생성 된 스레드가 시작될 때 호출됩니다.

getView().post(new Runnable() {

         @Override
         public void run() {
             getView().startAnimation(a);
         }
     });

코드 :getView().startAnimation(a);

귀하의 코드에서

post는 Runnable ( 코드 가 다른 스레드에서 실행 됨)이 메시지 큐를 추가하도록합니다.

따라서 startAnimation은 messageQueue 에서 가져올 때 새 스레드에서 시작됩니다.

[편집 1]

UI 스레드 (메인 스레드) 대신 새 스레드를 사용하는 이유는 무엇입니까?

UI 스레드 :

  • 응용 프로그램이 시작되면 Ui Thread가 자동으로 생성됩니다.

  • 적절한 위젯에 이벤트를 전달하는 역할을하며 여기에는 그리기 이벤트가 포함됩니다.

  • Android 위젯과 상호 작용하는 스레드이기도합니다.

예를 들어 화면에서 a 버튼을 터치하면 UI 스레드가 터치 이벤트를 위젯에 전달하고, 위젯은 누른 상태를 설정하고 이벤트 대기열에 무효화 요청을 게시합니다. UI 스레드는 요청을 대기열에서 빼고 자신을 다시 그리도록 위젯에 알립니다.

사용자가 longOperation을 수행하는 버튼을 누르면 어떻게됩니까?

((Button)findViewById(R.id.Button1)).setOnClickListener(           
             new OnClickListener() {        
        @Override
    public void onClick(View v) {
            final Bitmap b = loadImageFromNetwork();
            mImageView.setImageBitmap(b);
}
});

UI가 멈 춥니 다. 프로그램이 충돌 할 수도 있습니다.

public void onClick(View v) {
  new Thread(new Runnable() {
    public void run() {
        final Bitmap b = loadImageFromNetwork();
        mImageView.setImageBitmap(b);
    }
  }).start();
}

작업자 스레드에서 직접 UI를 업데이트하지 않는 Android 규칙을 위반합니다.

Android는 다른 스레드에서 UI 스레드에 액세스하는 여러 방법을 제공합니다.

  • Activity.runOnUiThread (실행 가능)
  • View.post (실행 가능)
  • View.postDelayed (실행 가능, long)
  • 매니저

아래와 같이

View.post (실행 가능)

public void onClick(View v) {
  new Thread(new Runnable() {
    public void run() {
      final Bitmap b = loadImageFromNetwork();
      mImageView.post(new Runnable() {
        public void run() {
          mImageView.setImageBitmap(b);
        }
      });
    }
  }).start();
}

매니저

final Handler myHandler = new Handler();

(new Thread(new Runnable() {

    @Override
    public void run() {
       final Bitmap b = loadImageFromNetwork();
      myHandler.post(new Runnable() {                           

        @Override
        public void run() {
           mImageView.setImageBitmap(b);
          }
        });
      }
    })).start();                
}

enter image description here

더 많은 정보를 위해서

http://android-developers.blogspot.com/2009/05/painless-threading.html

http://www.aviyehuda.com/blog/2010/12/20/android-multithreading-in-a-ui-environment/


Is this being done on onCreate or onCreateView? If so, the app might not be in a state where the View is attached to the window. A lot of algorithms based on View metrics may not work since things like the View's measurements and position may have not been calculated. Android animations typically require them to run through UI math

View.post actually queues the animation on the View's message loop, so once the view gets attached to the window, it executes the animation instead of having it execute manually.

You are actually running things on the UI thread, but at a different time


Have a look here for a good answer. view.post() is the same as handler.post() pretty much. It goes into the main thread queue and gets executed after the other pending tasks are finished. If you call activity.runOnUiThread() it will be called immediately on the UI thread.


The problem I think could be the life-cycle method where you are calling the post() method. Are you doing it in onCreate()? if so look at what I found in the activity's onResume() documentation:

onResume()

Added in API level 1 void onResume () Called after onRestoreInstanceState(Bundle), onRestart(), or onPause(), for your activity to start interacting with the user. This is a good place to begin animations, open exclusive-access devices (such as the camera), etc.

https://developer.android.com/reference/android/app/Activity.html#onResume()

So, as Joe Plante said, maybe the view is not ready to start animations at the moment you call post(), so try moving it to onResume().

PD: Actually if you do move the code to onResume() then I think you can remove the post() call since you are already in the ui-thread and the view should be ready to start animations.

참고URL : https://stackoverflow.com/questions/13840007/what-exactly-does-the-post-method-do

반응형