Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从广播接收器更新活动UI组件?_Java_Android_Broadcastreceiver - Fatal编程技术网

Java 从广播接收器更新活动UI组件?

Java 从广播接收器更新活动UI组件?,java,android,broadcastreceiver,Java,Android,Broadcastreceiver,我有非常基本的问题。这可能很简单,但我不明白。 我有一个活动,我正在使用一些UI组件。我还有一个广播接收器(从清单注册) 我需要更新活动类的一些UI组件。 像- 为此-一种解决方案是将updateLayout()方法设置为public static,并在receiver类中按活动引用使用该方法。但是我认为,这不是正确的方法。。 有什么合适的方法吗 不必在清单中注册接收者,您可以在运行时注册和注销它,如下所示: 另外,请确保在意向过滤器中使用正确的操作注册您的接收器 public class My

我有非常基本的问题。这可能很简单,但我不明白。 我有一个活动,我正在使用一些UI组件。我还有一个广播接收器(从清单注册) 我需要更新活动类的一些UI组件。 像-

为此-一种解决方案是将updateLayout()方法设置为public static,并在receiver类中按活动引用使用该方法。但是我认为,这不是正确的方法。。
有什么合适的方法吗

不必在清单中注册接收者,您可以在运行时注册和注销它,如下所示:

另外,请确保在意向过滤器中使用正确的操作注册您的接收器

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          
    }
}  

}
公共类MyActivity扩展活动{
//用于侦听任务完成后发送的意图
//成功处理
专用广播接收器mUpdateReceiver=新广播接收器(){
@凌驾
公共void onReceive(上下文、意图){
新建UpdateUiTask().execute();
}
};
@凌驾
在Resume()上公共无效{
registerReceiver(mUpdateReceiver,新意向过滤器(
你的意图(行动);
super.onResume();
}
@凌驾
public void onPause(){
未注册接收人(mUpdateReceiver);
super.onPause();
}
//用于更新用户界面
私有类UpdateUiTask扩展异步任务{
@凌驾
受保护的void onPreExecute(){
}
@凌驾
受保护的字符串背景(无效…无效){
Context=getApplicationContext();
字符串result=“test”;
//将获得的数据放在后台任务之后。
返回结果;
}
@凌驾
受保护的void onPostExecute(字符串结果){
//TODO:UI更新
}
}  
}
希望有帮助。

来自:

您可以使用 registerReceiver()或静态发布实现 通过AndroidManifest.xml中的标记

Activity.onResume()
implementation中注册接收器,并在
Activity.onPause()中注销接收器


您可以使用观察者模式,活动在onResume()中通过广播接收器注册自身以接收更新,并在onPause()中注销自身


网上有很多学习观察者模式的资料-

您可以将ObserveEvent与Extendes Observable类一起使用

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);
            }
        } 
}
公共类通知中心{
私有HashMap observables=新HashMap();
/**
*延迟加载事件总线
*/
公共void addObserver(字符串通知,Observer){
ObservableEvent observable=可观测的.get(通知);
if(可观察==null){
可观察=新的可观察事件();
可观察的。放置(通知,可观察);
}
可观察的。添加观察者(观察者);
}
public void removeObserver(字符串通知,观察者){
可观察的=可观察的。获取(通知);
如果(可观察!=null){
可观察的。删除观察者(观察者);
}
}
公共void postNotification(字符串通知,对象){
ObservableEvent observable=可观测的.get(通知);
如果(可观察!=null){
setChanged();
如果(object==null){
可观察的;
}否则{
观察者(对象);
}
} 
}
}


只需添加观察器来观察通知和触发方法,使用POST通知

> P>如果您真的必须继续使用<代码>广播接收器< /C> >从代码>注册ANDROIDMANDS.XML<代码>,那么您可以考虑使用事件总线。Square有一个很酷的开源库

它很好地实现了发布者/订阅者模式。你会在网上找到很多关于如何使用它的例子,非常简单。首先,看看奥托的


如果您可以直接从
活动注册/取消注册接收器,那么我将遵循@Ritesh Gune answer。

我当然会推荐GreenRobot的EventBus

EventBus是一种Android优化的发布/订阅事件总线。Android应用程序的典型用例是将活动、片段和背景线程粘在一起。这些元素的常规布线通常会引入复杂且容易出错的依赖关系和生命周期问题。由于EventBus通过所有参与者传播侦听器(例如,后台服务->活动->多个片段或帮助器类),因此不推荐使用。EventBus将事件发送器和接收器解耦,从而简化应用程序组件之间的通信。代码越少,质量越好。而且您不需要实现单个接口


签出:

您可以在活动中对广播接收器进行子类化,或者,使用委托模式当我为receiver类创建子类时,我必须将其设为静态类,并且再次将方法设为静态。为什么必须将其设为静态?我正在从清单注册广播。您能告诉我有关委托模式的更多信息吗?异步任务的目的是什么?提供异步任务只是为了以防万一根据onReceive()中的结果意图进行网络调用。在这种情况下,可以在doInBackground()中执行此操作。否则,只需在postExecute()中更新UI即可@blackbelt,如果这里能做得更好,我一定很想知道。Thnx。
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);
            }
        } 
}