Android : Activity.runOnUiThread와 View.post의 차이점은 무엇입니까?


97

답변:


104

View.post활동에 직접 액세스 할 수 없을 때 도움이된다는 점을 제외하고는 실제 차이가 없습니다 .

두 경우 모두 UI 스레드가 아닌 경우 Handler#post(Runnable)백그라운드에서 호출됩니다.

UI 스레드 호출 - CommonsWare의 주석에서 설명한 바와 같이, 둘 사이의 차이가 Activity#runOnUiThread부르는 것이다 run하면서 직접 방법 View#post게시한다 runnable큐에 (예를 들면 전화 Handler#post)

IMO의 중요한 점은 둘 다 동일한 목표를 가지고 있으며이를 사용하는 사람 에게는 차이가 없어야한다는 것입니다 (그리고 구현은 향후 변경 될 수 있음).


70
한 가지 차이점 runOnUiThread()은 현재 스레드를 확인 Runnable하고 주 응용 프로그램 스레드에있는 경우 즉시 실행합니다 . 호출되는 스레드에 관계없이 post()항상을 Runnable대기열에 넣습니다 .
CommonsWare

감사합니다. 이제 설명과 @CommonsWare 의견을 기반으로 차이점을 볼 수 있습니다.
Alexander Kulyakhtin

4
@Ashwin : "당신은 runOnUiThread ()가 Runnable을 즉시 실행한다고 말했습니다."-아니, 나는하지 않았다. 댓글을 다시 읽어주세요. 나는 " runOnUiThread()현재 스레드를 확인하고 우리가 메인 애플리케이션 스레드에있을 경우Runnable 즉시 실행한다 "고 말했다 (강조 추가됨). "현재 UI 스레드에있는 것이 무시되고 이것이 우선 순위가 부여된다는 의미입니까?" - "무엇 이제까지 UI 스레드에서 현재 것은" 입니다 전화. runOnUiThread()
CommonsWare

1
@ barn.gumbl :이 경우 소스를 살펴 보았습니다.
CommonsWare

1
이다 차이. 창에 연결되지 않은보기에 게시하면 아무 작업도 수행되지 않습니다. 이 아니 긴하지만 차이는,이 미묘한 버그를 야기하고 차이가 존재 인식하지 못하는 경우 탐색에 매우 성가신 수 있습니다.
dcow

23

Activity.runOnUiThread와 view.post ()의 또 다른 차이점은 view.post ()의 runnable이 뷰가 창에 연결된 후 호출된다는 것입니다.


보여진 다니 무슨 뜻이야? 보이게 되나요? 보이지 않는 뷰에서 호출되지 않습니까?
Alexander Kulyakhtin 2014 년

알렉스의 모호성을 수정했습니다.
pareshgoel 2014 년

5
이것이 IMHO의 가장 중요한 차이점입니다. 많은 사람들이 view.post ()를 사용하여 뷰가 연결된 후 실행해야하는 작업을 실행합니다.
Sotti

3
이것은 사실이 아닙니다. 이것은 사실이 아니었지만 어떤 시점에서 View.java 용 JavaDoc은 "View가 창에 연결될 때 View.post가 다른 스레드에서만 작동한다"고 잘못 설명했습니다. 이 문제는 2012 년 10 월 15 일 에 수정 되었지만 Android 개발자의 마음을 관통하는 데 시간이 걸렸습니다.
알렉스 콘

이 차이에 대한 @pareshgoel 소스?
apostleofzion

17

어느 대부분의 경우 그들은 상호 교환 대부분 허용,하지만 그들은 이다 미묘하게 다른. 물론 가장 큰 차이점은 하나는에서 사용할 수 Activity있고 다른 하나는 View. 둘 사이에 겹치는 부분이 많지만에서에 Activity액세스 할 수없는 View경우도 있고에서 View액세스 할 수없는 경우도 있습니다 Activity.

내가 만난 가장자리 사례 중 하나는 다른 SO 질문에 대한 답변View.post 에서 언급했습니다 : 가 창에 연결된 경우 에만 다른 스레드에서 작동합니다 . 이것은 거의 문제가 없지만, 때때로이 될 수 있습니다 당신이 전화 특히, 실행 결코 에 당신의 방법 . 대안은 무엇 을 사용하고 어쨌든 덮개 아래에서 사용하는 것입니다.View.postView.postViewRunnableView.postonCreateActivityHandler.postActivity.runOnUiThreadView.post

(정확성을 위해 편집 됨, "다른 스레드에서"추가됨)


1
또한 연결되지 않은 경우 실패 할 수 onCreate()있습니까? 흠, 이 경우 Handler제공 한 ViewRoot에 게시 할 것으로 예상합니다 .
Jens

5
@Jens 그래, 나는 소스를 훑어 보았고 아직 첨부되지 않은 경우 나중에 실행되도록 대기열에 View.post추가해야합니다 Runnable. 소스에 대해 자세히 살펴 보지는 않았지만 문서 에는 "이 뷰가 창에 연결된 경우에만 UI 스레드 외부에서이 메서드를 호출 할 수 있습니다."라고 문서 에 나와 있습니다. 그래서 나는 그것이 현재 스레드에 있다면, 당신이 말한 것이 사실이라고 생각합니다. 그렇지 않으면 아마도 Runnable. 나는 확실히 내 코드에서 그런 일이 일어났다.
kabuko

@kabuko 귀하의 답변은 다른 지점에서 보여 주셔서 감사합니다. 내가 그 메타 포럼 ADRESS된다 뒤에 1 개 이상의 답이 논리를 볼 수 없습니다 받아 들일 수 없다 얼마나
알렉산더 Kulyakhtin

3
이것은 사실이 아닙니다. 이것은 사실이 아니었지만 어떤 시점에서 View.java 용 JavaDoc은 "View가 창에 연결될 때 View.post가 다른 스레드에서만 작동한다"고 잘못 설명했습니다. 이 문제는 2012 년 10 월 15 일 에 수정 되었지만 Android 개발자의 마음을 관통하는 데 시간이 걸렸습니다.
알렉스 콘

0

또 다른 차이점 post은 뷰당입니다. runOnUiThread활동 당입니다.

이 수단은 할 (? 미래에) 가능합니다 view.getQueue/ activity.getQueue당신은 당신의 자신의 추적 또는 필터링 코드없이 정확히 원하는 것을 얻을.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.