2012-12-03 4 views
0

more Activity에서 Handler이 필요합니다.핸들러가 고정적 일 수 있습니까?

나는

public static Handler handler = new Handler(); 

또는 내가 더 후 하나 개의 활동에서 어떻게 사용할 수 같은이 정적 만들 수 있습니까? 이 사람이 정적 일 수 없다면 하나 이상의 처리기를 가질 수 있습니까?

나는 Handler가 정적이어야한다는 것을 알고 있었는데, 그렇지 않다면 나는 다른 스레드에서 예외를 얻는다. 이것은 좋은 생각이 아니다.

올바른 방법은 무엇입니까?

+0

핸들러를 정적으로 읽어야하는 곳은 어디입니까? – AndroidGecko

답변

1
I need Handler in more then one Activity 
다음 방금 acitvity 당 핸들러를 작성하지 왜

?

아니면 어떻게 하나 이상의 활동에서 사용할 수 있습니까?

그냥 그들은 모두 문서에서 같은 루퍼 객체

에 결합한다, 활동 당을 만들 :이 사람이 정적 일 수없는 경우

When you create a new Handler, it is bound to the thread/message queue of the thread that is `creating it` 

내가 두 개 이상의 핸들러를 가질 수 ? 확인

내가 처리기 그렇지 않으면 나는 이것이 좋은 생각이 아니라고 다른 스레드에서 예외를 얻을 수 있습니다 정적이어야 읽고 있었다. 내가 발견

유일한 문제는이 This Handler class should be static or leaks might occur: IncomingHandler 했지만이 언급 당신이 오래 지연 메시지를 게시 할 때, 그것은 단지입니다.

0

Handler 구현이 스레드로부터 안전하거나 프로그램이 단일 스레드 환경에서 실행되는 경우 여러 이벤트/활동을 하나씩 처리하여 정적으로 선언하는 단일 처리기 인스턴스를 가질 수 있습니다.

스레드가 안전하지 않으면 다중 스레드 환경의 여러 활동/이벤트에 대해 동일한 핸들러 인스턴스를 사용하면 예기치 않은 결과가 표시됩니다.

+0

스레드로부터 안전하지 않습니다. 그리고 네, 단지 하나가 아닌 더 많은 쓰레드를 사용하고 있습니다. 그래서 모든 클래스에서 다른 핸들러를 사용하도록 제안합니까? – senzacionale

+0

이렇게 말한 것처럼. 하나의 액티비티, 서비스, ...에 대한 하나의 핸들러? http : //www.vogella.com/articles/AndroidPerformance/article.html#concurrency_handler – senzacionale

0

처리기는 항상 정적입니다. Activity의 onCreate에서 Handler를 생성해야합니다. 개별 지식을 얻으려면 개별 활동을 위해 별도의 핸들러를 만들어야합니다.

1

핸들러는 루퍼 스레드로 초기화 된 스레드에만 유효합니다.

UI 스레드는 루퍼 스레드이며 대부분의 Android 구성 요소는 UI 스레드에서 인스턴스화하는 모든 클래스를 비롯하여 활동, 서비스, 콘텐츠 공급자, 사용자 지정 응용 프로그램 클래스 등 UI 스레드에서 실행됩니다.대신 사용할 수있는 처리기를 만드는

: 대신 메시지를 사용하려면

http://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable)

하지만 당신은 핸들러를 사용해야합니다.

핸들러를 정적으로 만들기 위해 경고하는 lint 오류가 발생하면 대신 정적 중첩 클래스를 사용하여 외부 클래스 및 일부 경우 문제가 발생할 수있는 모든 멤버에 대한 암시 적 참조를 얻지 못합니다. 이 경고를 피하기 위해 핸들러를 다음과 같이 선언 할 수 있습니다.

static MyHandler extends Handler { 
    // TODO: implement message handling, etc here 
} 

private mHandler = new MyHandler(); 
+0

애플리케이션은 메인 스레드에서 정적으로 초기화되며, 이는 ui 스레드와 동일합니다. 그러므로 ui 루퍼가 있습니다. 왜 응용 프로그램에서 정적 처리기를 선언하는 것이 문제가됩니까? – auval

+0

알겠습니다. 귀하의 의견이 그것이 맞다고 생각할 때 제 답변에서 마지막 단락을 제거하겠다고 생각합니다. –

관련 문제