2014-05-21 3 views
0

BroadcastReceiver과 (과) 충돌하는 문제가 발생했습니다. 내가 그것을 사용하려고 그 다음에Android 브로드 캐스트 수신기, 수신하지 않습니까?

<receiver android:name="com.goosesys.gaggle.Main$UIUpdater"> 
     <intent-filter> 
      <action android:name="com.goosesys.gaggle.populate"/> 
     </intent-filter> 
    </receiver> 

그리고 것 :

JSONArray array = new JSONArray(xmppBack.getPayload()); 

    Intent intent = new Intent(Constants.BC_POPULATE); 
    intent.setAction(Constants.BC_PROGRESSINIT); 
    intent.putExtra(Constants.BC_PROGRESSSIZE, array.length()); 
    GaggleApplication.getContext().sendBroadcast(intent); 

아, 그리고 상수 : 여기

public class UIUpdater extends BroadcastReceiver { 
     private final Handler handler; 
     public UIUpdater(Handler handler) 
     { 
      this.handler = handler; 
     } 

     @Override 
     public void onReceive(final Context context, final Intent intent) 
     {   
      String action = intent.getAction(); 
      Log.i("MAIN", " >>> ACTION <<< : " + action); 

      if(action.equalsIgnoreCase("PROGRESSINIT")) 
      { 
       int size = intent.getIntExtra("PROGRESSSIZE", 0); 
       updatePopulateProgressSize(size); 
      } 

      handler.post(new Runnable(){ 
       @Override 
       public void run(){ 
        updatePopulateProgress(intent.getIntExtra("PROGRESS", 0));     
       } 
      }); 
     } 
    } 

매니페스트의 다음은 수신기의 정의입니다

public static final String BC_POPULATE    = "com.goosesys.gaggle.populate"; 
public static final String BC_PROGRESSINIT   = "PROGRESSINIT"; 
public static final String BC_PROGRESSSIZE   = "PROGRESSSIZE"; 
public static final String BC_PROGRESSINC   = "PROGRESSINC"; 

사실, 나는 각 부분을 모두 밟았으며 모두 괜찮습니다. 오류도 누출도 문제가 없습니다. 그냥 onReceive은 팝되지 않습니다 것을 :(

나는 부드러운 주시기 바랍니다, 브로드 캐스트 리시버에 새로 온 사람, 사전에)

건배!

답변

3

LogCat을 살펴 봤더니 안드로이드가 UIUpdater 인스턴스를 생성 할 수 없다는 내용의 스택 추적으로 경고 또는 오류를 발견했을 것입니다.

  1. 그것은 static 내부 클래스없고, 그래서 프레임 워크 (경우에만 외부 Main 클래스의 인스턴스가 생성 될 수있다)

  2. 그것의 인스턴스를 생성 할 수있다 : 즉, 두 가지 이유에서이다 제로 인수 생성자가, 그 프레임 워크는 또한

사용 무엇을하지 않습니다,이 같은 방송 정기적으로 시스템에 대한 좋은 사용 사례가 아닙니다. 진행중인 이벤트 버스 (LocalBroadcastManager, Square 's Otto, greenrobot 's EventBus 등)를 사용하십시오. 성능 향상 (IPC 없음), 보안 향상 (현재 사용자는 수신기를 해킹 할 수 있음), 코드를 단순화 할 수 있습니다 (Otto 또는 EventBus를 사용하는 경우).

+1

팁 주셔서 감사합니다. 매우 감사. 해킹은 모든 사람에게 공개되지 않는 회사 전달 응용 프로그램이므로 나를 괴롭게하지는 않지만, 사용자가 작성한 의견으로 인해 이벤트 버스를 사용하기로 결정했습니다. 정확히는 오토. 많은 감사합니다! – LokiSinclair

+0

"greenrobot 's EventBus"에 감사드립니다. –

0

수신자를 어딘가에 등록해야합니다. 일반적으로 onCreate 메서드에서는 다음과 같이 처리합니다.

registerReceiver(new UIUpdater(mhandler), new IntentFilter()); 
+1

매니페스트에 선언 된 경우에도? – LarsH

관련 문제