我目前正在开发Android应用程序包含以下活动:安卓:根据从后台线程对象的值更新UI服务
- MainActivity;
- UpdateActivity。
除此之外它还包含一个完全独立的包装,其中存在以下类:
- SyncService:其是,正如名称已经表明,一个服务。更具体一个绑定服务;
- SyncServiceManager:其结合于该服务的单独的对象。
- SyncTask:只包含服务需要执行的逻辑。所以服务是唯一与之交互的对象;
- 一对夫妇的接口,有可能使我的经理与服务进行交互。而2个接口只是为我的应用使用观察者模式。服务是应该通知经理,syncTask和updateActivity做某事的主题。
我面临的问题是,我想修改我的updateActivity的UI,取决于服务需要执行其工作时更改的枚举。通知syncTask执行所请求的作业(使用Web服务的数据配置,重置或同步应用程序数据库)。
然而,因为我想使服务做他的事情的背景我用一个新的线程对象,它可以做我想做的事情的事情。 除了事实上我可以修改更新活动中的用户界面,因为只能从UI线程编辑用户界面,所以这是所有类型的工作方式。 我已经在论坛上发现了一个非常有前途的链接,但我无法弄清楚它是否真的是我需要的和/或如何实现的。 android: update UI from another thread in another class
这是我的代码。 的服务:
public enum ServiceState {
RESETTING,
CONFIGURING,
SYNCHRONIZING,
IDLE
}
private Vector<IObserver> observers = new Vector<IObserver>();
private IBinder syncBinder = new SyncServiceBinder();
private ServiceState serviceState;
@Nullable
@Override
public IBinder onBind(Intent intent) {
return syncServiceBinder;
}
private final IBinder syncServiceBinder = new SyncServiceBinder();
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Thread th = new Thread(new Runnable() {
@Override
public void run() {
//Modifying the service state and starting the sync depending on the state.
startSync();
}
});
th.start();
return START_REDELIVER_INTENT;
}
private void startSync() {
notifyObservers(serviceState);
}
@Override
public void registerObserver(IObserver iObserver) {
observers.add(iObserver);
}
@Override
public void unregisterObserver(IObserver iObserver) {
observers.remove(iObserver);
}
@Override
public void notifyObservers(SyncService.ServiceState serviceState) {
for (IObserver observer : observers) {
observer.update();
}
}
更新活动:
public class UpdateActivity extends Activity implements IObserver {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.update_activity);
}
@Override
public void update() {
//Modify UI from here depeding on the serviceState
}
}
我也想过用其自带的活动类的runOnUiThread的功能,但它只是被炒鱿鱼的方式太晚了。在updateactivity中创建一个新的处理程序并创建一个允许我向处理程序发送消息的runnable也是如此。
你们有什么想法/建议?
由于事先
迈克尔
创建BroadCastReceiver并将其注册到您的活动中,从服务Broad Cast的意图。根据'onReceive'中的数据更新您的活动 – Pragnani