在我的 Android 应用程序中,我有一个 Observable
Data
类,它包含一个方法 download()
来下载和解析一些数据。完成后,它会通知它的 Observer
。
此外,我还有一个Activity
和一个Service
。 Activity
使用 AsyncTask
异步调用 download()
方法。
Service
需要不断地监听更新以进一步处理数据。这不应该发生在 UI 线程中。我创建了这个小的 Service
类:
public class MyService extends Service {
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onCreate() {
new MyWorkerThread().start();
}
private class MyWorkerThread extends Thread implements Observer{
@Override
public void run() {
observeData();
}
private void observeData(){
Data.getInstance().addObserver(this);
}
@Override
public void update(Observable observable, Object data) {
// In what thread does the code placed here run?
}
}
}
现在,我的问题是:当 Data
类的 download()
方法通知它的 Observer
时,哪个线程将 update()
方法运行?这个会不会在Activity
创建的AsyncTask
的线程中,防止代码通过onPostExecute()
方法,直到服务已经完成了?如果是这样,我是否最好让我的 MyService
成为 Observer
并每次都创建一个新的 MyWorkerThread
?
或者代码会在 MyWorkerThread
自己的线程中运行吗?
我希望它是可以理解的,提前致谢!
最佳答案
I guess I'd better create a new Thread everytime the notifyObservers method is called
您可以这样做,但不是必须的。例如,使用单个 HandlerThread
可以完成同样的事情。此外,您不必处理并行运行的多个线程。
public class ObserverService extends Service {
private Looper mLooper;
private void onDataChanged() {
// do whatever you need.
// This is executed in a background thread.
}
@Override
public void onCreate() {
HandlerThread ht = new HandlerThread("ObserverService");
ht.start();
mLooper = ht.getLooper();
final Handler handler = new Handler(mLooper) {
@Override
public void handleMessage(Message msg) {
// executed in background HandlerThread
onDataChanged();
}
};
Observer observer = new Observer() {
@Override
public void update(Observable observable, Object data) {
// this is executed in whatever thread notifies
// enqueue max 1 messages.
handler.removeMessages(1234);
handler.sendEmptyMessage(1234);
}
};
// register observer that send message to background thread.
Data.getInstance().addObserver(observer);
}
@Override
public void onDestroy() {
mLooper.quit();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return Service.START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
关于java - 观察者和线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12602278/