핸들러 메시지 전달 메커니즘에 대한 간략한 분석


이 섹션 소개

처음 두 섹션에서는 Android의 두 가지 이벤트 처리 메커니즘을 연구했습니다. 이 섹션에서는 다음 두 가지 유형의 이벤트 응답만 설명합니다. 이는 Activity의 UI 구성요소에 있는 정보 전송 핸들러입니다. 스레드 안전을 위해 Android에서는 인터페이스를 새로 고칠 때 UI 스레드 외부에서 UI를 조작하는 것을 여러 번 허용하지 않는다는 것을 많은 친구들이 알고 있을 것입니다. 핸들러를 통해 UI 구성요소 업데이트를 알려야 합니다! 인터페이스 업데이트를 완료하기 위해 핸들러를 사용하는 것 외에도 runOnUiThread()를 사용하여 업데이트하거나 더 고급 트랜잭션 버스를 사용할 수도 있습니다. 물론 여기서는 핸들러란 무엇인지, 실행 프로세스, 관련 방법 및 하위 용도에 대해서만 설명합니다. 스레드와 메인 스레드의 차이점!


학습 로드맵:

1.jpg


2. 핸들러 클래스 소개:

2.jpg


3. 핸들러 실행 흐름도:

3.jpg

흐름도 분석: 관련 명사

  • UI 스레드: 시스템이 UI 스레드를 생성할 때 Looper 개체를 초기화하고 이와 관련된 MessageQueue도 생성합니다.
  • Handler: 이 스레드의 기능은 정보를 전송하고 처리하는 것입니다. 핸들러가 정상적으로 작동하려면 현재 스레드에 Looper 객체가 있어야 합니다.
  • Message: 핸들러가 수신하고 처리하는 메시지 객체
  • MessageQueue: 메시지 큐, 선입선출 관리 메시지는 Looper 객체가 초기화될 때 초기화됩니다. 이와 관련된 MessageQueue를 만듭니다.
  • Looper: 각 스레드는 하나의 Looper만 가질 수 있고, MessageQueue를 관리하며, 지속적으로 여기에서 메시지를 꺼내서 루프에 배포합니다. 처리를 위한 해당 핸들러!

간단히 말하면:

하위 스레드가 활동의 UI 구성 요소를 수정하려는 경우 새 핸들러 개체를 만들고 이 개체와 정보를 통해 기본 스레드에 정보를 보낼 수 있습니다. 우리는 먼저 대기하기 위해 메인 스레드의 MessageQueue로 이동하고 Looper는 이를 선입선출 순서로 가져온 다음 메시지의 어떤 속성에 따라 처리하기 위해 해당 핸들러에 배포합니다. 물체!


4. 핸들러 관련 방법:

  • void handleMessage(Message msg): 메시지 처리 방법, 일반적으로 재정의되는 데 사용됩니다!
  • sendEmptyMessage(int what): 빈 메시지 보내기
  • sendEmptyMessageDelayed(int what, long DelayMillis): 밀리초 단위로 지연을 지정한 후 빈 메시지를 보냅니다.
  • sendMessage(Message msg): 즉시 메시지를 보냅니다.
  • sendMessageDelayed(Message msg): 밀리초 단위로 지연을 지정합니다. Send message
  • final boolean hasMessage(int what): 메시지 대기열에 지정된 값으로 what 속성을 가진 메시지가 포함되어 있는지 확인합니다. 매개변수가 (int what, Object 객체)인 경우: what 속성을 판단하는 것 외에도 Object 속성이 지정된 객체에 대한 메시지인지 여부도 판단해야 합니다.

5. 핸들러 사용 예:

1 ) 핸들러는 메인스레드에 작성됩니다

메인스레드에서는 시스템이 이미 Looper 객체를 초기화했기 때문에 정보를 보내고 처리하는 Handler 객체를 직접 생성합니다!

코드 예: 타이머 타이머를 통해 정기적으로 이미지를 전환하고 ImageView에 표시된 콘텐츠를 정기적으로 수정하여 프레임 애니메이션을 형성하는 간단한 프로그램

렌더링 실행:

4.gif

구현 코드:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android :id="@+id/RelativeLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
tools:context="com.jay.example.handlerdemo1.MainActivity " >

android:layout_alignParentLeft="true"
android:layout_alignParentTop="true" " />
</RelativeLayout>

MainActivity.java:

public class MainActivity extends Activity {

//전환된 그림의 배열 ID 정의
int imgids[] = new int[]{
R.drawable.s_1, R.drawable.s_2,R.drawable.s_3, ​> ~  ‐     ‐ {                                                                      [imgstart++ % 8])
               | saveInstanceState);
setContentView(R. layout.activity_main);
final ImageView imgchange = (ImageView) FindViewByid (R.id.imgchange);

// 타이머를 사용하여 핸들러가 200밀리초마다 빈 정보를 보내도록 합니다. c void run() {
myHandler.sendEmptyMessage(0x123);
                                   
2) 핸들러는 하위 스레드에 작성됩니다

핸들러가 하위 스레드에 작성되면 생성 과정은 다음과 같습니다.

1 )
Looper.prepare() 메서드를 직접 호출하여 현재 스레드에 대한 Looper 객체를 생성하면 해당 생성자가 일치하는 MessageQueue를 생성합니다.

2 )

Handler 객체를 생성하고 처리할 handlerMessage() 메서드를 재정의합니다. 다른 스레드의 정보!

3)

Looper.loop() 메서드를 호출하여 Looper

사용 예: 숫자를 입력하고 계산 후 이 범위의 모든 소수는 Toast구현 코드를 통해 출력됩니다: main.xml:

<LinearLayout

xmlns:android="http://schemas.android. com/apk /res/android"

android:layout_width="match_parent"

android:layout_height="match_parent" android:orientation="vertical"> <EditText

android:id="@+id/etNum"
android: inputType="number"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:hint="상한을 입력하세요"/>
 <버튼
 android:layout_width="match_parent" "
android:layout_height ="wrap_content"
android:onClick="cal"
android:text="Calculate"/>
</LinearLayout>

MainActivity.java:

CPublic 클래스 Calprime 확장 활동 {
정적 최종 문자열 Upper_num = "Upper"; 클래스 Calthread 확장 스레드 {
공개 처리기 Mhandler;

공개 Void run() {) looper.prepare()
mHandler = new handler();
// 처리 메시지 정의 방법 @Override
public void handlermessage (Message msg) {
if (msg.what == 0x123)
{
int UPPER = msg.getdata ()
list & lt ; 정수 & gt; nums = new arraylist & lt; ()
// 계산은 2부터 시작합니다. , 상위
OUTER:
for (int i = 2; i & lt; = 상단; i ++)
i)
if (i! = 2 && i % j == 0);//토스트를 사용하여 계산된 모든 소수를 표시합니다.        ’ s ‐ ‐ ‐ ‐ ‐ ,                                                        
                            |
}
@Override
public void onCreate(Bundle saveInstanceState)
{
super.onCreate(savedInstanceState)
setContentView(R) .layout.main) ;
        etNum = (EditText)findViewById(R.id.etNum); calThread = new CalThread()                                                                                                      calThread                        >
msg.what = 0x123 번들 = new Bundle();
Bundle.putInt(UPPER_NUM,
Int eger.parseInt(etNum.getText().toString()))
msg .setData(bundle);//새 스레드의 핸들러에 메시지 보내기
                                                                                                                                                                                  Android의 CalThread.mHandler 이벤트 전달을 간략하게 분석합니다. Handler, Message, MessageQueue, Loop의 개념과 메인 쓰레드와 서브 쓰레드에 작성된 Handler의 차이점!