Android中的MVC:异步更新的应用程序或服务?

Phi*_*hil 6 model-view-controller service android

(对不起,我的第一篇文章中没那么清楚)

情况就是这样:我有从互联网刷新的数据.我们称之为Model.

我想做的事情:基本上它听起来像MVC模型,Model在本地(私有)存储中也保持持久性.该Model方法及其相关方法是应用方面的.有几个Activity显示和操纵它的不同方面:

  • 用户Activity可以Model 从不同的角度浏览不同的视图.目前我有一个ListActivityfor all元素,Activity一个元素的详细信息
  • 有时Model需要提神.当然这是在不同的线程上完成的.可以从几个Activity人的触发器中触发刷新.
  • 有几个(耗时的)常见任务可以从不同Activity的任务中触发
  • 我的应用程序Model 在启动和停止时加载并保存到私有存储

我的问题:我不知道放在哪里Model和相关的任务.另外,我不知道用什么机制来通知Activity.目前我想出了两种方法:

  • 使用Service和发送广播.保存到磁盘是执行的Service#onDestroyed(),所以我想通过绑定它来最小化它Activity.在这一点上,我也不能确定如何为客户提供更新的信息:是否提供吸气Binder,或包括在广播消息.
  • 自定义Application对象,以便全局提供刷新方法getter.然后我从Activity使用中执行更新AsyncTask.如果有其他Activity的是当前的背后Activity,他们会更新onResume(),当用户导航回.

我没有使用静态方法的类的原因:

  • 我需要保存并存储Model到磁盘.
  • 一些方法需要Context来显示toasts,通知,缓存等.

此外,我没有把这些功能放在一个,Activity因为有几个活动操纵同一块持久数据.

下面是伪代码说明我的意思:

使用服务:

/** Service maintaining state and performing background tasks */
class MyService extends Service {
    Model mModel;
    Binder mBinder;

    onCreate() {
        super.onCreate();
        mBinder = new Binder();
        // load mModel from disk, or do default initialization
    }

    onDestroy() {
        super.onDestroy();
        // save mModel to disk
    }

    onBind() {
        return mBinder;
    }

    class Binder {
        refresh() {
            new AsyncTask() {
                doInBackground() {
                    // update mModel from Internet
                }
                onPostExecute() {
                    sendBroadcasts(new Intent("my.package.REFRESHED"));
                }
            }.execute();
        }

        getState() {
            return mModel.getState();
        }
    }
}

/** Activity displaying result */
class MyActivity extends ListActivity {
    MyService.Binder mBinder;

    onCreate() {
        super.onCreate();
        // register mReceiver
        // bind service
    }

    onDestroy() {
        super.onDestroy();
        // unbind service
        // unregister mReceiver
    }

    /** Invokes time-consuming update */
    refresh() {
        // binding is asynchronous, and user may trigger refreshing too early
        if (mBinder != null) {
            mBinder.refresh();
        }
    }

    BroadcastReceiver mReceiver = new BroadcastReceiver() {
        onReceive(Intent intent) {
            if ("my.package.REFRESHED".equals(intent.getAction())
                    && mBinder != null) {
                updateViews(mBinder.getState());
            }
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

使功能在自定义Application对象中可以全局访问

/** Custom Application providing domain specific functionalities */
class MyApplication extends Application {
    Model mModel;

    onCreate() {
        super.onCreate();
        // load mModel from disk, or do default initialization
    }

    onTerminate() {
        super.onTerminate();
        // save mModel to disk
    }

    void refresh() {
        /** time-consuming */
    }

    getState() {
        return mModel.getState();
    }
}

/** Activity displaying result */
class MyActivity extends ListActivity {
    onResume() {
        super.onResume();

        // in case some top Activities have refreshed
        // and user is navigating back
        updateViews(((MyApplication)getApplicationContext()).getState());
    }

    /** Invokes time-consuming update */
    refresh() {
        new AsyncTask() {
            doInBackground() {
                ((MyApplication)getApplicationContext()).refresh();
            }
            onPostExecute() {
                // update the ListView according to result
                updateViews(((MyApplication)getApplicationContext()).getState());
            }
        }.execute();
    }
}
Run Code Online (Sandbox Code Playgroud)

我能想到的Service方法的缺点是复杂性,因为Binding是异步的.而且我很可能需要重复一些代码,因为我有两个ListActivityActivity

对于该Application方法,文档说不依赖于onTerminate()被调用.

我知道我很尴尬.解决这类问题的传统方法是什么?

非常感谢.

xil*_*il3 0

好吧,您可以扩展 BroadcastReceiver 而不是 Service,当它完成需要做的事情时,它会加载带有结果的 Activity。