안드로이드 서비스에서 백그라운드 작업을 수행하기위한 스레드를 만들었습니다.
스레드가 기본 스레드의 메시지 대기열에 특정 작업을 게시 해야하는 상황이 있습니다 (예 : a) Runnable
.
Handler
메인 스레드 를 가져 와서 다른 스레드에서 게시 Message
/ 게시 하는 방법이 Runnable
있습니까?
감사,
답변
참고 :이 답변은 많은 주목을 받았으므로 업데이트해야합니다. 원래 답변이 게시 된 이후 @dzeikei의 의견은 원래 답변만큼이나 많은 주목을 받았습니다. 가능한 해결책은 다음과 같습니다.
1. 백그라운드 스레드에 Context
객체에 대한 참조가있는 경우 :
백그라운드 워커 스레드가 컨텍스트 오브젝트에 액세스 할 수 있는지 확인하십시오 (응용 프로그램 컨텍스트 또는 서비스 컨텍스트 일 수 있음). 그런 다음 백그라운드 작업자 스레드 에서이 작업을 수행하십시오.
// Get a handler that can be used to post to the main thread
Handler mainHandler = new Handler(context.getMainLooper());
Runnable myRunnable = new Runnable() {
@Override
public void run() {....} // This is your code
};
mainHandler.post(myRunnable);
2. 백그라운드 스레드에 Context
객체가 없거나 필요한 경우
(@dzeikei에서 제안 함) :
// Get a handler that can be used to post to the main thread
Handler mainHandler = new Handler(Looper.getMainLooper());
Runnable myRunnable = new Runnable() {
@Override
public void run() {....} // This is your code
};
mainHandler.post(myRunnable);
답변
아래의 주석가가 올바르게 지적했듯이 이것은 서비스의 일반적인 솔루션이 아니며 활동에서 시작된 스레드 (서비스는 그러한 스레드 일 수는 있지만 모든 스레드는 아닙니다)입니다. 서비스 활동 커뮤니케이션의 복잡한 주제에 대해서는 공식 문서의 전체 서비스 섹션을 읽으십시오-복잡하기 때문에 기본 사항을 이해하는 것이 좋습니다 :
http://developer.android.com/guide/components/services.html # 알림
아래 방법은 가장 간단한 경우에 작동 할 수 있습니다.
올바르게 이해하면 응용 프로그램의 GUI 스레드에서 일부 코드를 실행해야합니다 ( “메인”스레드라는 다른 것을 생각할 수 없음). 이를 위해 다음과 같은 방법이 있습니다 Activity
.
someActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
//Your code to run in GUI thread here
}//public void run() {
});
이것이 당신이 찾고있는 것이기를 바랍니다.
답변
컨텍스트에 액세스 할 수없는 경우 다른 간단한 방법이 있습니다.
1). 메인 루퍼에서 핸들러를 만듭니다.
Handler uiHandler = new Handler(Looper.getMainLooper());
2). Runnable 인터페이스를 구현하십시오.
Runnable runnable = new Runnable() { // your code here }
삼). Runnable을 uiHandler에 게시하십시오.
uiHandler.post(runnable);
그게 전부입니다 😉 스레드와 함께 즐거운 시간을 보내십시오.
답변
스레드에서 코드를 실행하는 경우 (예 : 일부 작업 지연) runOnUiThread
컨텍스트에서 호출해야합니다 . 예를 들어 코드가 MainActivity
클래스 내부에 있으면 다음을 사용하십시오.
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
myAction();
}
});
기본 (UI 스레드) 또는 다른 스레드에서 메소드를 호출 할 수 있다면 다음과 같은 검사가 필요합니다.
public void myMethod() {
if( Looper.myLooper() == Looper.getMainLooper() ) {
myAction();
}
else {
}
답변
압축 코드 블록은 다음과 같습니다.
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
// things to do on the main thread
}
});
여기에는 활동 참조 또는 응용 프로그램 참조를 전달하지 않아도됩니다.
코 틀린 동등 물 :
Handler(Looper.getMainLooper()).post(Runnable {
// things to do on the main thread
})
답변
코 틀린 버전
때 당신이 활동에있는 다음 사용
runOnUiThread {
//code that runs in main
}
때 당신이 활동 컨텍스트가 , mContext는 사용
mContext.runOnUiThread {
//code that runs in main
}
사용 가능한 컨텍스트 가 없는 곳에있는 경우
Handler(Looper.getMainLooper()).post {
//code that runs in main
}
답변
컨텍스트가없는 경우 가장 간단한 방법, RxAndroid를 사용하는 경우 다음을 수행 할 수 있습니다.
AndroidSchedulers.mainThread().scheduleDirect {
runCodeHere()
}