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到磁盘.此外,我没有把这些功能放在一个,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是异步的.而且我很可能需要重复一些代码,因为我有两个ListActivity和Activity
对于该Application方法,文档说不依赖于onTerminate()被调用.
我知道我很尴尬.解决这类问题的传统方法是什么?
非常感谢.
| 归档时间: |
|
| 查看次数: |
1899 次 |
| 最近记录: |