java - 观察者和线程

标签 java android

在我的 Android 应用程序中,我有一个 Observable Data 类,它包含一个方法 download() 来下载和解析一些数据。完成后,它会通知它的 Observer

此外,我还有一个Activity 和一个ServiceActivity 使用 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/

相关文章:

android - 在运行时获取 android 应用程序版本代码(主要、次要和补丁)

java - 如何比较 JSTL 1.0 中 bean 属性的子字符串?

java - 非法参数异常 : Authorities list must not be null

java - 如何确定列表中的选择百分比

android - 在发布应用程序之前是否应该禁用日志?

android - 在 fragment 中获取颜色

java - Java/JSP 中的 Response.End()

java - 如何在jetty中禁用slf4j

java - 在 spring messages.properties 中,使用错误代码作为键时如何确保错误消息换行?

Android NDK - 使用 ICU 支持构建 sqlite 时出错