2014-07-24 4 views
7

나는 매우 기본적인 질문을 가지고있다. 그리고 그것은 아주 간단 할지도 모르지만 나는 그것을 얻지 않고있다. 일부 UI 구성 요소를 사용하는 활동이 있습니다. 또한 브로드 캐스트 수신기 (등록 목록에서 등록) Activity 클래스의 일부 UI 구성 요소를 업데이트해야합니다. 추천 - 드리려고 한 솔루션브로드 캐스트 수신기에서 활동 UI 구성 요소를 업데이트 하시겠습니까?

Class MyActivity extends Activity 
    { 

     onCreate(){ 

     //using some UI component lets say textview 
      textView.setText("Some Text"); 
     } 

     updateLayout() 
     { 
     textView.setText("TextView Upadated..."); 
     } 
} 


Class broadCastReceiver 
{ 

    onReceive() 
    { 
     //here I want to update My Activity component like 
     UpdateLayout(); 

    } 

} 

정적 updateLayout가() 방법을 공개하고, 활성 참조 수신기 클래스의 메소드를 사용한다는 것이다. 그러나 나는 이것이 올바른 방법이 아니라고 생각합니다. 그럴 수있는 적절한 방법이 있습니까?

+1

당신은 내가 수신기 클래스를 서브 클래 싱 할 때 나는 그것을 정적 클래스 확인해야하고 다시 내가 만들 필요가 위임 패턴 – Blackbelt

+0

를 사용, 활동 안에 방송 수신기를 서브 클래스, 또는 할 수 있습니다 정적 인 방법으로 .. –

+0

왜 정적으로해야합니까? – Blackbelt

답변

4

발사에 대한 관찰자를 추가 할 BroadcastReceiverAndroidManifest.xml에 등록하면 이벤트 버스를 사용할 수 있습니다. 멋진 오픈 소스 라이브러리 Otto은 Square입니다.

게시자/구독자 패턴을 매우 잘 구현하고 있습니다. 웹에서 사용하는 방법에 대한 많은 예제를 찾을 수 있습니다. 매우 간단합니다.먼저 Otto의 체크 아웃 website

Activity에서 수신기를 직접 등록/등록 취소 할 수 있으면 @Ritesh Gune 응답을 따르십시오.

6

대신 매니페스트에서 수신기를 등록, 당신은 등록 할 수 있습니다 다음과 같이 런타임에 등록을 취소 :

또한 당신이 의도 필터의 올바른 동작과 수신기를 등록해야합니다.

public class MyActivity extends Activity{ 

// used to listen for intents which are sent after a task was 
// successfully processed 
private BroadcastReceiver mUpdateReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     new UpdateUiTask().execute(); 
    } 
}; 

@Override 
public void onResume() {   
    registerReceiver(mUpdateReceiver, new IntentFilter(
      YOUR_INTENT_ACTION)); 
    super.onResume(); 
} 

@Override 
public void onPause() {  
    unregisterReceiver(mUpdateReceiver); 
    super.onPause(); 
} 


// used to update the UI 
private class UpdateUiTask extends AsyncTask<Void, Void, String> { 

    @Override 
    protected void onPreExecute() { 

    } 

    @Override 
    protected String doInBackground(Void... voids) { 
     Context context = getApplicationContext(); 
     String result = "test"; 
     // Put the data obtained after background task. 
     return result; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     // TODO: UI update   
    } 
} 

} 

희망이 있습니다. docs에서

+0

비동기 작업의 목적은 무엇입니까? – Blackbelt

+0

비동기 작업은 onReceive()의 결과 의도를 기반으로 네트워크 호출이 수행되는 경우를 위해 제공됩니다. 이 경우 doInBackground()에서이를 수행 할 수 있습니다. 다른 하나는 postExecute()에서 UI를 간단히 업데이트 할 수 있습니다. @blackbelt, 여기서 더 잘할 수있는 것이 있는지 배우고 싶습니다. Thnx. –

2

: 당신은 동적으로 사용자의 AndroidManifest.xml에서 태그를 통해 구현 을 게시 정적 위해 Context.registerReceiver() 또는이 클래스의 인스턴스를 등록 할 수 있습니다

.

수신기를 Activity.onResume() 구현에 등록하고 Activity.onPause()에서 등록을 취소하십시오.

public class MyActivity extends Activity 
{ 
    private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      MyActivity.this.broadcastReceived(intent); 
     } 
    }; 

    public void onResume() { 
     super.onResume(); 
     IntentFilter intentFilter = new IntentFilter(); 
     // add action, category, data to intentFilter 
     this.registerReceiver(this.mBroadcastReceiver, intentFilter); 
    } 

    public void onPause() { 
     super.onPause(); 
     this.unregisterReceiver(this.mBroadcastReceiver); 
    } 

    public void broadcastReceived(Intent intent) { 
     // Update the UI component here. 
    } 
} 
0

당신은 업데이트와 onPause에서()를 자체 등록을 취소 수신하는 방송 수신기와 관찰자 패턴 활동이 onResume에 자신을 등록()를 사용할 수 있습니다.

은 그물에 재료의 많은 당신이 ObservableEvent 사용할 수 있습니다 http://en.wikipedia.org/wiki/Observer_pattern

3

패턴 - 옵저버를 배우고 관찰 가능한 클래스를 확장 할 수 있습니다. 당신이 정말로 계속 사용하는 경우

public class ObservableEvent extends Observable { 
public void setChanged(){ 
    super.setChanged(); 
} 
} 

만들기 싱글 톤 클래스 알림 센터

public class NSNotificationCenter { 

private HashMap<String, ObservableEvent> observables = new HashMap<String, ObservableEvent>(); 

/** 
* Lazy load the event bus 
*/ 

public void addObserver(String notification, Observer observer) { 
    ObservableEvent observable = observables.get(notification); 
    if (observable == null) { 
     observable = new ObservableEvent(); 
     observables.put(notification, observable); 
    } 
    observable.addObserver(observer); 
} 

public void removeObserver(String notification, Observer observer) { 
    Observable observable = observables.get(notification); 
    if (observable != null) { 
     observable.deleteObserver(observer); 
    } 
} 


public void postNotification(String notification, Object object) { 
     ObservableEvent observable = observables.get(notification); 
     if (observable != null) { 
      observable.setChanged(); 
      if (object == null) { 
       observable.notifyObservers(); 
      } else { 
       observable.notifyObservers(object); 
      } 
     } 
} 

}

단지 통보 관찰과 방법 사용 후 알림

4

나는 확실히는 안드로이드 이벤트 버스를 게시/구독 최적화 된 GreenRobot에서

EventBus를 EventBus를 권 해드립니다. Android 앱의 일반적인 사용 사례는 Activities, Fragments 및 백그라운드 스레드를 함께 붙이는 것입니다. 이러한 요소의 기존 배선은 종종 복잡하고 오류가 발생하기 쉬운 의존성 및 수명주기 문제를 야기합니다. EventBus가 모든 참여자 (예 : 백그라운드 서비스 -> 활동 -> 여러 단편 또는 도우미 클래스)를 통해 전파하는 리스너는 사용되지 않게됩니다. EventBus는 이벤트 발신자와 수신자를 분리하여 앱 구성 요소 간의 통신을 단순화합니다. 적은 코드, 우수한 품질. 또한 단일 인터페이스를 구현할 필요가 없습니다!

체크 아웃 : https://github.com/greenrobot/EventBus

관련 문제