handle 및 다중 스레드
2835 단어 android 컨트롤
Post
Handler의 Post 방식에 있어서, 이 Runnable 대상에 Runnable () 방법을 다시 쓰는 Runnable 대상을 메시지 대기열에 전달합니다.일반적으로 이 런 () 방법에서 UI 라인에 필요한 동작을 기록합니다.
Handler의 Post 방법은 다음과 같습니다.
다음은Demo를 통해Handler의post 방식으로 새로 시작하는 루트에서 UI 구성 요소의 속성을 수정하는 방법을 설명합니다
처음에는 많은 사람들이 myThread의run () 방법이 새로운 라인에서 실행될 것이라고 생각했지만 사실은 그렇지 않았다.다음 코드의handler는 myThread의 start () 방법을 호출하지 않고 런 () 방법을 직접 호출했습니다. 이것은 실제적으로 새로운 라인을 만들지 않았고 현재 라인에서run () 방법을 호출했을 뿐입니다.
다음은 모두가 비교적 잘 알고 있는 코드이다.
Handler handler = new Handler();
handler.post(myThread);
// myThread
Runnable mythread = new Runnable() {
public void run() {
}
};
처음에는 많은 사람들이 myThread의run () 방법이 새로운 라인에서 실행될 것이라고 생각했지만 사실은 그렇지 않았다.
상기 코드의handler는 myThread의 start () 방법을 호출하지 않고 런 () 방법을 직접 호출했습니다. 이것은 실제적으로 새로운 라인을 만들지 않았고 현재 라인에서run () 방법을 호출했을 뿐입니다.
이것은 run () 방법에 많은 시간을 들인 다음 Handler 대상을 사용하여 이 라인을 라인 대기열에 게시하는 문제와 관련이 있습니다.원래 우리는 현재 프로세스에 영향을 주지 않도록 이 소모된 조작을 다른 라인에 두기를 희망했다.그러나 실제로는 정반대이다.post () 이하의 코드는run () 방법이 실행된 후에야 계속 실행될 수 있다.현재 라인을 주 라인으로 한다면 주 프로그램은 경직 상태에 있을 것이다.
만약 시간이 소모되는 조작이 있다면, 반드시 다른 라인을 만들어야 하며,handle도 사용할 수 있다.HandlerThread로 할 수 있어요.
가장 간편한 방법은 JAVA에서 다중 스레드를 실현하는 방법, 즉 Thread 대상을 만들고 start () 방법을 호출하는 것이다.
코드는 다음과 같은 또 다른 방법이 있습니다.
//HandlerThread , Looper
HandlerThread handlerThread = new HandlerThread("handler_Thread");
handlerThread.start();//
MyHandler myHandler = new MyHandler(handlerThread.getLooper());// Looper Handler
// MyHandler
Message msg = myHandler.obtainMessage();
msg.sendToTarget();// message message Handler
// Handler
class MyHandler extends Handler {
MyHandler(Looper looper) {
super(looper);
}
public void handleMessaage(Message msg) {
//
}
}
오늘 나는 안드로이드 문서를 자세히 보았는데android는 두 가지 라인을 만드는 방법을 지원하지만 규칙이 있다는 것을 발견했다.
원문: it violates the second rule of the single-threaded model: do not access the Android UI tool Kit from outside the UI thread.
즉, Android는 UI 스레드 이외의 스레드에서 UI 컨트롤을 수정할 수 없습니다.예를 들어 Textview에 텍스트를 설정하면 UI 스레드 이외의 스레드에서 실행할 수 없습니다. 그렇지 않으면 이상이 발생할 수 있습니다.