두 개의 스레드 (메인 및 데이터 로더)가있는 앱이 있습니다. 데이터 로더가 끝나면 (DevGuide에서 설명한대로) 주 스레드에 Runnable 객체를 게시하지만 결코 전달되고 실행되지 않습니다. 핸들러가 기본 스레드에 메시지 또는 Runnable을 전달하지 못했습니다.
class MyApp extends Application
{
public void onCreate()
{
LoaderThread t = new LoaderThread();
t.start();
}
private class LoaderThread extends Thread
{
public void run()
{
SystemClock.sleep(2000);
boolean res = m_handler.post(m_runnable);
if(res)
Log.d(TAG, "Posted Runnable");
}
}
private final Handler m_handler = new Handler();
private final Runnable m_runnable = new Runnable() {
public void run()
{
Log.d(TAG, "Hey, i'm runnable!");
}
}
}
은 또한 그것은 어쩌면 중요한 내가 ApplicationTestCase에서 파생 된 단위 테스트로이 코드를 실행 유의하기 :
class MyAppTest : public ApplicationTestCase
{
public MyAppTest()
{
super(MyApp.class);
}
public void testLoading()
{
createApplication();
// few asserts follow here...
}
}
그래서이 실패
는 여기에 기본 코드입니다. Runnable은 run() 호출을받지 못한다. 로그는 성공적으로 게시되었음을 나타낸다. 또한 runnable (예를 들어 m_handler.sendEmptyMessage (1))을 게시하는 대신 간단한 메시지를 보내려고했습니다. 메인 스레드의 핸들러 콜백에 전달되지 않습니다.
무엇이 여기에 있습니까? 사전 :
나는 그렇게 생각했지만 루퍼는 정말로 만들어졌습니다. 왜냐하면 내가 직접 (위의 제안을 시도하는 것을 포함하여) 만들려고 할 때 : "java.lang.RuntimeException : 하나의 루퍼가 스레드 당 하나만 생성 될 수 있습니다" 또한 코드가 변경되지 않았다는 것을 알았습니다. 운영 체제에서 완전히 날아간 응용 프로그램을 실행했을 때 좋았습니다. 반면에 테스트 케이스로 실행하면 작동하지 않습니다 ... 힌트 : 루퍼는 괜찮습니다. null이 아니며 예외도없고 로그에 오류가 없습니다. 나는 당혹 스럽다. – dimsuz
힌트를 보내 주셔서 감사합니다! 내 코드는 Activity 내에서가 아니기 때문에 루퍼 내에 없습니다. 나는 핸들러를 통해 보낸 메시지가 호출 스레드가 중단되었을 때만 전달되는 이유를 알아 내려고했습니다. – Sney