http://robobinding.github.io/RoboBinding/getting_started.zh.html#_layout


1. RoboBinding是什么?

Android应用的粘接剂 - RoboBinding是一个实现了数据绑定 Presentation Model 模式的Android开源框架。RoboBinding帮助你编写更可读,易于测试与维护的UI代码。

2. Hello AndroidMVVM(Presentation Model)

基于RoboBinding的应用,一个Activity通常由三个部分组成:Layout xml,Activity class 与 PresentatonModel。 以下以最简单的AndroidMVVM为例。

2.1. Layout

在layout中声明RoboBinding命名空间,属性与事件绑定。

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"xmlns:bind="http://robobinding.org/android"><TextViewbind:text="{hello}" />...<Buttonandroid:text="Say Hello"bind:onClick="sayHello"/>
</LinearLayout>

2.2. Presentation Model(pure POJO)

在presentation model类中声明相应的属性与方法。Presentation model 为纯POJO类。

org.robobinding.androidmvvm.PresentationModel.java

@org.robobinding.annotation.PresentationModel
public class PresentationModel implements HasPresentationModelChangeSupport {private String name;public String getHello() {return name + ": hello Android MVVM(Presentation Model)!";}...public void sayHello() {firePropertyChange("hello");}
}

2.3. Activity Class

在activity类中将layout与对应的presentation model绑定在一起。

org.robobinding.androidmvvm.MainActivity.java

public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {...PresentationModel presentationModel = new PresentationModel();View rootView = Binders.inflateAndBindWithoutPreInitializingViews(this, R.layout.activity_main, presentationModel);setContentView(rootView);}
}

最简单的AndroidMVVM就完成了。这里我们用Binders工具类。在实际的开发中,我们推荐使用org.robobinding.binder.BinderFactoryBuilder。 然后将BinderFactory实例保存在Android application实例里或由第三方类库如RoboGuice来管理,以便在整个应用中共享。

2.4. RoboBinding的介绍视频

  • 2014年7月 Cheng Wei做的介绍视频可以在 这里找到。

  • 2012年2月 Robert Taylor做的介绍视频可以在 这里找到。

3. 开发环境

3.1. Eclipse

首先安装Eclipse。

3.1.1. 不使用AspectJ

robobinding-[version]-with-dependencies.jar 或 robobinding-[version].jar + [google guava]-[11.0.1+].jar 加入项目的libs目录, 然后右击项目→Properties→Java BuildPath→Libraries→Add Jars,将jar加入classpath。并在Order and Export中勾选它(或它们)。

Eclipse build settings
Figure 1. 项目构建设置(以robobinding-[version]-with-dependencies.jar为例)

3.1.2. 使用AspectJ

RoboBinding aspects可以帮你自动的产生代码,以便减少工作量。 首先安装Android Development Tools(ADT) Eclipse 插件。 右击项目→Configure→Convertto AspectJ Project。AspectJ natures将被添加到项目的.project文件。

将 robobinding-[version]-with-aop-and-dependencies.jar 或 robobinding-[version]-with-aop.jar + [google guava]-[11.0.1+].jar 加入项目的classpath。 并在Orderand Export中勾选它(或它们)。

最后确认 robobinding jar在Aspect路径里,右击项目→Properties→AspectJ Build→Aspect Path→Add JARs。

Aspectj settings
Figure 2. AspectJ设置(以robobinding-[version]-with-aop-and-dependencies.jar为例)

3.1.3. Annotaton Processing设置

下载RoboBinding的codegen-[version]-with-dependencies.jar。然后按照下图进行设置。codegen-XX.jar只用于代码产生,项目不依赖于这个jar。

Annotation processing settings
Figure 3. Annotaton Processing设置

3.2. Android Studio

3.2.1. 不使用AspectJ

在gradle.build里添加robobinding依赖。

dependencies {...compile"org.robobinding:robobinding:${robobindingVersion}"//或者使用with-dependencies jar(RoboBinding提供一个proguard过的体积小的with-dependencies jar。)。compile("org.robobinding:robobinding:${robobindingVersion}:with-dependencies") {exclude group: 'com.google.guava', module: 'guava'}
}

请参考RoboBinding 下的AndroidMVVM, RoboBinding-album-sample以及RoboBinding-gallery例子项目。

3.2.2. 使用AspectJ

在gradle.build里添加RoboBinding Android aspectj plugin。

buildscript {repositories {...maven() {name 'RoboBinding AspectJPlugin Maven Repository'url "https://github.com/RoboBinding/RoboBinding-aspectj-plugin/raw/master/mavenRepo"}}dependencies {...classpath 'org.robobinding:aspectj-plugin:0.8.+'}
}...
apply plugin: 'org.robobinding.android-aspectj'

在gradle.build里添加robobinding依赖。

dependencies {...compile "org.robobinding:robobinding:$robobindingVersion"aspectPath "org.robobinding:robobinding:$robobindingVersion"//或者使用with-aop-and-dependencies jar(RoboBinding提供一个proguard过的体积小的with-aop-and-dependencies jar。)。compile ("org.robobinding:robobinding:$robobindingVersion:with-aop-and-dependencies") {exclude group: 'com.google.guava', module: 'guava'}aspectPath ("org.robobinding:robobinding:$robobindingVersion:with-aop-and-dependencies") {exclude group: 'com.google.guava', module: 'guava'}
}

请参考RoboBinding 下的 RoboBinding-album-sample以及RoboBinding-gallery例子项目。

3.2.3. Annotation processing设置

在gradle.build里添加apt plugin。

buildscript {repositories {...}dependencies {...classpath 'com.neenbedankt.gradle.plugins:android-apt:1.+'}
}...
apply plugin: 'com.neenbedankt.android-apt'

3.3. ProGuard

保留PresentationModel的共公方法以及生成的代码的构造函数信息。保留所有的annoations。

-keepattributes *Annotation*,Signature
-keep,allowobfuscation @interface org.robobinding.annotation.PresentationModel-keep @org.robobinding.annotation.PresentationModel class * {public *** *(...);
}-keep class * implements org.robobinding.itempresentationmodel.ItemPresentationModel{public *** *(...);
}-keep class * extends org.robobinding.presentationmodel.AbstractPresentationModelObject{public <init>(...);
}-keep class * extends org.robobinding.presentationmodel.AbstractItemPresentationModelObject{public <init>(...);
}

增加以下的内容,使ProGuard保留view listeners的构造函数名:

-keepclassmembers class * implements org.robobinding.viewattribute.ViewListeners {public <init>(...);
}

增加以下的内容,抑制google guava的javax.annotation.XX 引用警告。

-dontwarn javax.annotation.**

请参考RoboBinding 下的 RoboBinding-album-sample例子项目的ProGuard配置文件[project]/app/proguard-rules.txt。

4. 主要概念与特性

robobinding_based_app.png
Figure 4. 基于RoboBinding的Android应用

一个Android应用包含了若干个Activity以及其它的元素。在基于RoboBinding的应用里一个Activity包含了Activity主文件,Layout以及PresentationModel类。 (而Android普通应用一个Activity只包含了Activity主文件与Layout)。原先位于Activity内的显示层逻辑被提取到独立的文件PresentationModel内。 Activity利用RoboBinding将Layout与对应的显示逻辑PresentationModel绑定在一起。把Layout中的显示数据与PresentationModel中的属性绑定;Layout中的事件与PresentationModel中的方法绑定。RoboBinding替代了原先在Activity中的UI关联代码,减少应用代码。 在理想的情况下,PresentationModel只包含显示逻辑不包含UI代码,便与独立测试。

以下的例子代码来自 Robobinding Gallery。

4.1. 单向属性绑定

单向绑定是指presentation model上的属性更新会自动的同步到相应的视图属性上。

activity_view.xml

<TextViewbind:visibility="{integerVisibility}"/>

ViewPresentationModel.java

public int getIntegerVisibility() {return integerVisibilityRotation.value();
}

RoboBinding遵循Java Beans标准,当暴露属性时,我们将提供getter与setter方法。 单向绑定时,presentation model中的属性只要求有getter。因为视图不会更新回presentation model。 已支持的UI绑定属性,请参考API与支持的绑定属性JavaDocs

4.2. 双向属性绑定

双向绑定在单向绑定的基础上,增加了将视图上的变更同步回presentation model相应的属性上。

EditText的text属性是支持双向绑定的一个例子。双向绑定的语法是在单向绑定属性的前面加一个$符号。

activity_edittext.xml

<EditTextbind:text="${text}"/>

org.robobinding.gallery.presentationmodel.EditTextPresentationModel.java

@PresentationModel
public class EditTextPresentationModel {private String text;public String getText() {return text;}public void setText(String text) {this.text = text;}
}

当将属性声明为双向绑定时,presentation model的对应属性必须有setter方法,以便于视图的更新值被设置到presentation model属性上。

4.3. 事件处理

即将视图中的事件绑定到presentation model相应的方法上。

activity_gallery.xml

<Buttonbind:onClick="showDemo"/>

org.robobinding.gallery.presentationmodel.GalleryPresentationModel.java

@PresentationModel
public class GalleryPresentationModel
{...public void showDemo(){...}
}

当onClick 事件被触发时,showDemo方法被调用。showDemo方法可以带有可选的相应的事件参数,这里为org.robobinding.widget.view.ClickEvent。 已支持的UI事件,请参考API与支持的绑定属性JavaDocs

4.4. AdapterViews绑定

当我们需要绑定AdapterViews,RoboBinding需要你在presentation model上提供数据集属性。数据集属性类型可以是一个Array,List或者org.robobinding.itempresentationmodel.TypedCursor。除此之外,我们还要提供ItemPresentationModel(即数据项presentation model),以便将每个数据项的视图绑定到ItemPresentationModel上。 RoboBinding里,我们通过在数据集属性上使用@ItemPresentationModel annotation做到。

activity_adapter_view.xml

<ListViewbind:itemLayout="@android:layout/simple_list_item_1"bind:itemMapping="[text1.text:{value}]"bind:source="{dynamicStrings}"/>

org.robobinding.gallery.presentationmodel.AdapterViewPresentationModel.java

@PresentationModel
public class AdapterViewPresentationModel
{...@ItemPresentationModel(value=StringItemPresentationModel.class)public List<String> getDynamicStrings(){return getSelectedSource().getSample();}

以下提供ItemPresentationModel以及数据项layout。Android中Adapter实现了重用,所以ItemPresentationModel也会被重用,即需要实现updateData方法。

org.robobinding.gallery.presentationmodel.StringItemPresentationModel.java

public class StringItemPresentationModel implements ItemPresentationModel<String>
{private String value;@Overridepublic void updateData(int index, String bean){value = bean;}public String getValue(){return value;}
}

例子中数据项layout为android系统提供的simple_list_item_1.xml。通过bind:itemMapping="[text1.text:{value}]",我们指定了simple_list_item_1.xml的text1.text关联到StringItemPresentationModel.value属性。

@ItemPresentationModel有一个factoryMethod属性。当ItemPresentationModel有一些外部的依赖时, 我们可以在PresentationModel里提供一个factoryMethod方法来创建这些ItemPresentationModels。 这样我们可以为这些ItemPresentationModel提供外部依赖并对其进行任意的配置。例如:

@PresentationModel
public class PresentationModelSample
{...@ItemPresentationModel(value=ItemPresentationModelSample.class, factoryMethod="createItemPresentationModelSample")public List<String> getDynamicStrings(){return getSelectedSource().getSample();}public ItemPresentationModelSample createItemPresentationModelSample() {return ItemPresentationModelSample(dependency1, dependency2, ...);}

4.5. 羽量级关系数据与对象cursor映射

AdapterViews绑定中,我们提到数据集属性类型的其中一种为org.robobinding.itempresentationmodel.TypedCursor。 由于应用中我们通常都习惯于操作对象并尽量隔离关系数据操作的那部分代码,RoboBinding加入了羽量级对象化的Cursor- TypedCursor。 通过org.robobinding.itempresentationmodel.RowMapper<T>来将一行的关系数据映射为一个对象实例。

org.robobinding.gallery.presentationmodel.TypedCursorPresentationModel.java

@PresentationModel
public class TypedCursorPresentationModel {...@ItemPresentationModel(value=ProductItemPresentationModel.class)public TypedCursor<Product> getProducts() {return allProductsQuery.execute(db);}
}

org.robobinding.gallery.model.typedcursor.GetAllQuery.java

public class GetAllQuery<T>
{private String tableName;private final RowMapper<T> rowMapper;public GetAllQuery(String tableName, RowMapper<T> rowMapper){...this.tableName = tableName;this.rowMapper = rowMapper;}public TypedCursor<T> execute(SQLiteDatabase db){Cursor cursor = db.query(tableName,null,null,null,null,null,BaseColumns._ID+" ASC");return new TypedCursorAdapter<T>(cursor, rowMapper);}
}

org.robobinding.gallery.model.typedcursor.ProductRowMapper.java

public class ProductRowMapper implements RowMapper<Product> {@Overridepublic Product mapRow(Cursor cursor) {String name = cursor.getString(cursor.getColumnIndex(ProductTable.NAME));String description = cursor.getString(cursor.getColumnIndex(ProductTable.DESCRIPTION));return new Product(name, description);}}

4.6. 菜单绑定

将 res/menu 下的菜单资源与对应的Presentation Model绑定在一起。以下是一个简单的例子。

res/menu/context_menu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"xmlns:bind="http://robobinding.org/android"xmlns:app="http://schemas.android.com/apk/res-auto"><item android:title="Delete Product"bind:onMenuItemClick="deleteProduct"android:id="@+id/deleteProduct"app:showAsAction="always"/></menu>

org.robobinding.gallery.presentationmodel.ContextMenuPresentationModel.java

@PresentationModel
public class ContextMenuPresentationModel {...public void deleteProduct(MenuItem menuItem) {...}
}

4.7. Presentation Model

我们需要在每个PresentationModel上用@org.robobinding.annotation.PresentationModel进行标注。 当在PresentationModel里需要用到org.robobinding.presentationmodel.PresentationModelChangeSupport时, 我们的PresentationModel需要实现org.robobinding.presentationmodel.HasPresentationModelChangeSupport接口。这样框架内部通过这个接口来使用同一个PresentationModelChangeSupport实例。

有两种方式实现PresentationModel。即使用AspectJ与不使用AspectJ。以下为两种方式的对比。

4.7.1. 不使用AspectJ

  • 依赖于robobinding-[version].jar 或 robobinding-[version]-with-dependencies.jar。

  • 其优点是无需额外的AspectJ依赖。最后的apk相对会小一点。

  • 需要手动编写firePropertyChange("propertyName")代码。

可以参考AndroidMVVM与Android-CleanArchitecture项目。

4.7.2. 使用AspectJ

  • 使用robobinding-[version]-with-aop.jar或robobinding-[version]-with-aop-and-dependencies.jar。

  • 很多的firePropertyChange("propertyName")代码由aspectJ自动生成。

  • 缺点是必须依赖于AspectJ Runtime Library。最后的apk大小会增加一点。

可以参考Album Sample与Gallery项目。

5. 创建视图绑定实现

以下的例子代码来自 Robobinding Gallery。

5.1. 简单的单向绑定属性

例如我们为android.View添加一个enabled绑定属性 - 源代码。

@ViewBinding(simpleOneWayProperties = {"enabled"})
public class ViewBindingForView extends CustomViewBinding<View> {
}

然后在BinderFactoryBuilder加入 - 源代码。

new BinderFactoryBuilder().add(new ViewBindingForView().extend(View.class)).build();

RoboBinding 为我们自动产生以下代码。

public class ViewBindingForView$$VB implements ViewBinding<View>{final ViewBindingForView customViewBinding;public ViewBindingForView$$VB(ViewBindingForView customViewBinding) {this.customViewBinding = customViewBinding;}@Overridepublic void mapBindingAttributes(BindingAttributeMappings<View> mappings) {mappings.mapOneWayProperty(ViewBindingForView$$VB.EnabledAttribute.class, "enabled");customViewBinding.mapBindingAttributes(mappings);}public static class EnabledAttribute implements OneWayPropertyViewAttribute<View, Boolean>{@Overridepublic void updateView(View view, Boolean newValue) {view.setEnabled(newValue);}}
}

由于所有的绑定都是静态的,对性能没有影响。

5.2. 其它绑定实现

除了以上简单单向属性绑定之外,还有事件绑定,多值属性绑定与复合属性绑定。当要实现这些绑定时,我们需要自己扩展CustomViewBinding实现绑定。 例如实现事件绑定如下。

@ViewBinding
public class MyCustomViewBinding extends CustomViewBinding<CustomView> {@Overridepublic void mapBindingAttributes(BindingAttributeMappings<CustomView> mappings) {mappings.mapEvent(OnCustomEventAttribute.class, "onCustomEvent");}public class OnCustomEventAttribute implements EventViewAttributeForView {...}
}

其它的绑定实现,可以参考RoboBinding的绑定属性实现 - widget包下的源代码。

5.3. 自定义组件或第三方组件

通过为自定义组件,第三方组件或未实现绑定的Android widget提供视图绑定实现,使它们更易于使用。在RoboBinding中,视图绑定实现方法是一致的。

custom_component.png
Figure 5. 自定义 Title Description Bar

我们以上图的自定义组件TitleDescriptionBar为例。该组件包含了标题与描述两个部分。在输入新的标题与描述后,点击'Apply',自定义组件的内容就更新为新的内容。

我们想使TitleDescriptonBar组件使用起来能像以下示例一样简单

activity_custom_component.xml

<org.robobinding.gallery.model.customcomponent.TitleDescriptionBarbind:title="{title}"bind:description="{description}"/>

以下是TitleDescriptionBar自定义组件的实现代码主要部分(如何实现自定义组件,请参考Android文档):

org.robobinding.gallery.model.customcomponent.TitleDescriptionBar.java

public class TitleDescriptionBar extends LinearLayout {private TextView title;private TextView description;public TitleDescriptionBar(Context context, AttributeSet attrs) {this(context, attrs, R.layout.title_description_bar);}protected TitleDescriptionBar(Context context, AttributeSet attrs, int layoutId) {super(context, attrs);LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);inflater.inflate(layoutId, this);title = (TextView) findViewById(R.id.title);description = (TextView) findViewById(R.id.description);...}public void setTitle(CharSequence titleText) {title.setText(titleText);}public void setDescription(CharSequence descriptionText) {description.setText(descriptionText);}
}

自定义组件的layout:title_description_bar.xml

<merge xmlns:android="http://schemas.android.com/apk/res/android"xmlns:bind="http://robobinding.org/android"><TextView android:id="@+id/title"/><TextView android:text=": "/><TextView android:id="@+id/description"/>

5.3.1. 实现绑定属性

TitleDescriptionBar有标题与描述两个简单单向属性绑定 - 源代码。

@ViewBinding(simpleOneWayProperties = {"title", "description"})
public class TitleDescriptionBarBinding extends CustomViewBinding<TitleDescriptionBar> {
}

5.3.2. 注册视图绑定实现

通过org.robobinding.binder.BinderFactoryBuilder注册视图绑定实现 - 源代码。

BinderFactory binderFactory = new BinderFactoryBuilder().add(new TitleDescriptionBarBinding().forView(TitleDescriptionBar.class)).build();

这样我们很容易的就完成了视图绑定实现。我们以同样的方式可以为任何第三方组件或未实现绑定的Android widget提供视图绑定实现。

5.4. 覆盖已有的视图绑定实现

当RoboBinding框架已有的视图绑定实现不满足需求, 我们可以注册覆盖已有的框架所提供的默认实现。

BinderFactory binderFactory = new BinderFactoryBuilder().add(new MyViewBindingForView().forView(View.class)).build();@ViewBinding
static class MyViewBindingForView extends CustomViewBinding<View> {...
}

5.5. 扩展已有的视图绑定实现

扩展已有的TextViewBinding并添加typeface属性绑定。

BinderFactory binderFactory = new BinderFactoryBuilder().add(new MyTextViewBinding().extend(TextView.class)).build();@ViewBinding(simpleOneWayProperties={"typeface"})
static class MyTextViewBinding extends CustomViewBinding<TextView> {...
}

6. Album唱片集例子项目学习

唱片集例子项目是Martin Fowler原始版本基于RoboBinding的Android翻译(Martin Fowler基于.Net的 原始版本 )。 项目地址 RoboBinding-album-sample。

album_sample_prototype.png
Figure 6. Album唱片集例子原型

以下"."表示相对于org.robobinding.albumsample的包路径。

以上是Album唱片集例子原型图。项目遵循RoboBinding应用的标准结构,即一个Activity由Activity主文件,Layout与PresentationModel Java文件组成。 项目源代码中包含以下几个包:org.robobinding.albumsample.activity包含所有Activity的主文件,org.robobinding.albumsample.presentationmodel包含所有PresentationModel文件,org.robobinding.albumsample.model仅包含一个Album实体实现文件,org.robobinding.albumsample.store包含一个基于内存Album实体存储实现AlbumStore。接下来列出上述五张图所对应的实现文件。

图[Home Activity]由.activity.HomeActivity,home_activity.xml与.presentationmodel.HomePresentationModel组成。

图[View Albums Activity]由.activity.ViewAlbumsActivity,view_albums_activity.xml与.presentationmodel.ViewAlbumsPresentationModel组成; 其唱片集每行的唱片信息由.presentationmodel.AlbumItemPresentationModel与album_row.xml组成;以及一个当唱片集为空时Layout显示文件albums_empty_view.xml。

图[Create Album Activity]与图[Edit Album Activity]由相同的.activity.CreateEditAlbumActivity,create_edit_album_activity.xml与.presentationmodel.CreateEditAlbumPresentationModel组成。

图[View Album Activity]由.activity.ViewAlbumActivity,view_album_activity.xml与.presentationmodel.ViewAlbumPresentationModel组成; 其删除对话框由.activity.DeleteAlbumDialog,delete_album_dialog.xml与.presentationmodel.DeleteAlbumDialogPresentationModel组成。

以下以[View Albums Activity]为例,对源代码做简单介绍。Activity类ViewAlbumsActivity只做了一件事,就是把Layout view_albums_activity.xml与ViewAlbumsPresentationModel关联起来。 view_albums_activity.xml里包含了三个子视图按顺序为TextView, ListView与Button。TextView没有包含任何绑定信息。ListView的bind:source="{albums}"绑定到ViewAlbumsPresentationModel.albums数据集属性。 bind:onItemClick="viewAlbum"绑定到ViewAlbumsPresentationModel.viewAlbum(ItemClickEvent)方法,单击某个唱片项时,该事件方法将被调用。 bind:emptyViewLayout="@layout/albums_empty_view"设置了当唱片集为空时的显示内容Layout。bind:itemLayout="@layout/album_row"设置了唱片项的行显示Layout,结合在ViewAlbumsPresentationModel.albums上给出的数据项PresentationModel,即@ItemPresentationModel(AlbumItemPresentationModel.class),来显示每一个唱片行。在album_row.xml里包含了两个简单的TextView,其bind:text="{title}"bind:text="{artist}"分别绑定到AlbumItemPresentationModel.title/artist属性。在view_albums_activity.xml里的最后一个Button视图,bind:onClick="createAlbum"绑定到ViewAlbumsPresentationModel.createAlbum()方法。

以下的入口类都位于Robobinding Gallery项目的org.robobinding.gallery.activity包下。

  • View绑定属性示例。入口类为ViewActivity。

  • EditText绑定属性示例。入口类为EditTextActivity。

  • AdapterView绑定属性示例。入口类为AdapterViewActivity。

  • ListView绑定属性示例。入口类为ListViewActivity。

  • RecyclerView绑定属性示例。入口类为RecyclerViewActivity。

  • 自定义组件绑定属性示例。入口类为CustomComponentActivity。

  • 对象化Cursor示例。入口类为TypedCursorActivity。

  • Fragment与ViewPager绑定示例。入口类为ListFragmentDemoActivity。

  • Options Menu绑定示例。入口类为OptionsMenuActivity。

  • Context Menu绑定示例。入口类为ContextMenuDemoActivity。

  • Contextual Action Mode绑定示例。入口类为ContextualActionModeActivity。

8. 项目结构组织与最佳实践

Presentation Model(MVVM)模式的初终是在MVC模式的基础之上,进一步的解耦,将UI的状态与逻辑放入 POJO Presentation Model,可被很容易的独立单元测试。 并使得View层→PresentationModel层→Model层 形成一个单向的依赖关系。当应用这个模式时,我们应该始终遵循这些基本原则。 Album Sample 是一个遵循最佳实践的例子。 推荐阅读Martin Fowler的原始 PresentationModel文章

8.1. 总体项目结构

Project structure
Figure 7. Project structure

在Android项目中,View层由Activity(Fragment)与Layout组成,Model层即业务模型层包含了各种的Services,持久化层,网络访问服务,以及业务服务等。 各层之间的依赖与访问关系如上图的箭头所示,View层不直接调用业务模型层。

8.2. 常见设计问题的解决方案

  • 当没有使用第三方依赖注入库时,业务模型层对象可以由View层的Activity实例化后传入Presentation Model。但View层不直接调用业务模型层。 只有Presentation Model与业务模型层交互。

  • 有些时候,Presentation Model层需要调用或使用View层的功能。我们通过给View层加入一个接口,然后让Presentation Model依赖于这个View接口的方式来解耦。 使PresentationModel能继续保持可被方便的独立单元测试。如果需要的话,我们可以将这些View接口归在Presentation Model层或Presentation Model包内, 使得依赖关系保持View→PresentationModel→Model的单向关系。以下是一个简单的示例:

interface MainView {void doSomeViewLogic();
}class MainActivity extends Activity implements MainView {...@Overrideprotected void onCreate(Bundle savedInstanceState) {...PresentationModel presentationModel = new PresentationModel(this);...}public void doSomeViewLogic() {...}
}class PresentationModel {private MainView mainView;public PresentationModel(MainView mainView) {this.mainView = mainView;}public void someEvent() {mainView.doSomeViewLogic();}
}

9. 其它资源

2012年一月 Robert Taylor 写了一些入门的文章在 这里 和 这里。

2012年二月 在London SkillsMatter,Robert Taylor作的RoboBinding介绍视频可以在 这里找到。

2014年7月 Cheng Wei做的RoboBinding介绍视频可以在 这里找到。

2014年9月 Adil在 YOW 2014 Android MVVM 演讲如何用MVVM模式写出干净,易维护,可测试的Android代码。

AndroidMVVM 是一个使用MVVM模式最小的例子。

RoboBinding album sample 是Martin Fowler的 PresentationModel 模式原始例子的基于RoboBinding的Android翻译版本。

RoboBinding Gallery 展示RoboBinding的各种功能与特性的用法。


查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. struts2通配符的使用

    Struts2之通配符前言:众所周知struts.xml文件的配置是struts2框架搭建必不可少的一环,所以配置struts.xml文件就是搭建struts2框架的日常,期间的各种报错也是在所难免的,当碰到:<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuratio…...

    2024/4/18 7:41:34
  2. HDU 5285 wyh2000 and pupil

    分析:这题和POJ 2492差不多,所以我用的是并查集,可以把题意理解为有很多人,要分成两个帮派,每个帮派至少有1个人,输入n,m分别代表n个人,和m对有冲突的人,有冲突的不能在一个帮派里,要尽可能的使第一个帮派的人多一些,如果存在输出第1,2个帮派的人数,否则输出Poorwyh…...

    2024/3/31 23:08:39
  3. Python自动化运维测试框架带你进一步了解Python的魅力

    关注头条号,私信回复资料会有意外惊喜呦………………最后一张照片有资料呦。令开发者万分高兴的是,开发自己的测试框架的日子终于结束了。以前,开发团队接手一个项目并开始开发时,除了项目模块的实际开发之外,他们不得不为这个项目构建一个自动化测试框架。一个测试框架应…...

    2024/4/25 8:32:24
  4. Silverlight ComboBox Bug - Value does not fall within the expected range

    Silverlight 2 Combobox 有一个bug, 今天被我遇到了,下面是IE错误信息:Error: Unhandled Error in Silverlight 2 Application Code: 4004 Category: ManagedRuntimeError Message: System.ArgumentException: Value does not fall within the expected range.at…...

    2024/4/16 19:33:20
  5. C语言中的代码格式及注意事项(一、基本格式)

    参考书目:周兆熊《C程序员从校园到职场》在实际编写C程序代码过程中,尤其是走向职场或者不断提高自身水平的需要,代码的格式规范可以让我们感受代码韵律之美,也能方便读者去理解代码,只要你不是计算机世界里单打独斗的孤胆勇士,代码更重要的是写给人看的,方便别人也方便…...

    2024/4/18 0:54:30
  6. DisJSet:Find them, Catch them(POJ 1703)

    抓住他们!题目大意:两个黑社会帮派,互相打架,现在你很多条信息,要你确定两个人是否属于不同帮派这题很有趣,题目不是直接给你两个人是否是一个帮派的,他给你的是不同帮派的,也就是给你很多个不同的要你找相同的。乍看很麻烦,但是还记得我以前发布过一个食物链的题解吗…...

    2024/5/4 13:58:47
  7. Android Things入门教程

    Android Things入门教程一文是一个摘要汇编,帮助Android Things初学者梳理入门学习的知识和资源、所需的硬件和配件,循序渐进的了解Android Things,并开始动手实践之旅。了解什么是Android Things一句话说,Android Things就是让开发者可以使用Android开发工具开发嵌入式设备…...

    2024/5/4 22:51:39
  8. 不支持 URI 格式。

    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.ArgumentException: 不支持 URI 格式。源错误: 行 1492: if (!File.Exists(thumbnailPath)) 行 1493: …...

    2024/4/16 19:34:34
  9. mount挂载文件报错

    mount: 文件系统类型错误、选项错误、10.0.110.113:/nfs 上有坏超级块、 缺少代码页或助手程序,或其他错误 (对某些文件系统(如 nfs、cifs) 您可能需要 一款 /sbin/mount.<类型> 助手程序) 有些情况下在 syslog 中可以找到一些有用信息- 请尝试…...

    2024/5/4 20:08:48
  10. Python自动化运维学习(一)

    我们要使用连接对象获得一个cursor对象,接下来,我们会使用cursor提供的方法来进行工作. 这些方法包括两大类:1.执行命令,2.接收返回值cursor用来执行命令的方法:callproc(self, procname, args) #用来执行存储过程,接收的参数为存储过程名和参数列表,返回值为受影响的行数execu…...

    2024/5/4 22:52:04
  11. Scala中具有类型类和隐式的四个模式的帮派(第2部分)

    类型类是库创建者和维护者的强大工具。 它们减少了样板,打开了要扩展的库,并充当了编译时间开关。 同样,GoF模式也是旨在提高代码质量的软件组织模式的集合。 上一篇博客文章探讨了使用一种带有类型类和隐式模式的模式 ,即桥模式 。 在这篇文章中,我将继续使用适配器模式 …...

    2024/5/5 3:16:13
  12. 您尝试使用 SharePoint 产品和技术向导时错误消息:"Exception: System.ArgumentException: 加密或解密过程中的错误

    您尝试使用 SharePoint 产品和技术向导时错误消息:"Exception: System.ArgumentException: 加密或解密过程中的错误" 察看本文应用于的产品 <script type=text/javascript>function loadTOCNode(){}</script>查看机器翻译免责声明文章编号 : 927156最…...

    2024/5/6 12:30:54
  13. mount_nfs: can't mount /data from x.x.x.x onto /Users/caicloud/nfs1: Operation not permitted

    今天自己用某云搭建了一台nfs共享,因为自己更喜欢在linux主机上调试,搭建好以后打算mount 到mac上,发现一下提示MacBook-Pro-4:~ caicloud$ sudo mount -t nfs x.x.x.x:/data nfs1/ mount_nfs: cant mount /data from x.x.x.x onto /Users/caicloud/nfs1: Operation not per…...

    2024/4/20 16:51:58
  14. Android基础入门教程——2.1 View与ViewGroup的概念

    Android基础入门教程——2.1 View与ViewGroup的概念标签(空格分隔): Android基础入门教程本节引言:告别了第一章,迎来第二章——Android中的UI(User Interface)组件的详解, 而本节我们要学习的是所有控件的父类View和ViewGroup类!突发奇想,直接翻译官方文档对 这两…...

    2024/3/28 19:53:17
  15. 【Python与运维】Python运维常用模块与脚本编写

    文章目录OS模块 OS模块os.close(fd),fd为文件标识符 用于关闭指定的文件os.open(fd),fd为文件描述符 用于打开指定的文件os.open() os.chdir() os.chmod() os.chown() os.closerange() os.fchdir() os.fchmod() os.fchown() os.fdatasync() os.fdopen() os.fsync() os.getcwd(…...

    2024/4/16 19:34:45
  16. POJ1703带权并查集(距离或者异或)

    题意:有两个黑社会帮派,有n个人,他们肯定属于两个帮派中的一个,然后有两种操作 1 D a b 给出a b 两个人不属于同一个帮派 2 A a b 问a b 两个人关系 输出 同一个帮派,不是同一个帮派,或者不确定 思路: 比较简单的带权并查集,容易想,方法固定,可以开距离根节点的距离…...

    2024/5/4 21:30:58
  17. unity发布遇到的三个坑

    坑一 ArgumentException: The Assembly System.Configuration is referenced by System.Data (‘Assets/Plugins/System.Data.dll’). But the dll is not allowed to be included or could not be found. 解决方法: 打开PlayerSettings,将.NET 2.0 Subset 改为.NET 2.0 。坑…...

    2024/4/16 19:33:52
  18. HRBUST - 2371 GT’s Dream 权值线段树

    在现实中认了无数师傅却毫无长进的GT在梦中成为了某武侠世界的神。在这个世界中初始有n个人,他们各成一派。作为世界神GT总共会进行m次操作,每次操作有如下两种情况 1 x y 表示x所在的帮派吞并了y所在的帮派,若x与y本来就处于同一个帮派则该操作无效。 2 k 表示GT想要…...

    2024/4/16 19:34:51
  19. 运维学Python | 给小白的10个使用案例,快速入门Python就靠它了

    今天给大家分享十个Python入门级别的小案例。这十个案例的难度不高,但是对于知识的使用非常全面,很适合小白在学习的初期建立学习信心和增加熟练度。每个案例下都有或多或少的思路分析,希望对大家有帮助案例一:排列组合要求:将4个数字可能组成的所有互不相同且无重复数字的…...

    2024/4/16 19:34:45
  20. Android 基础教程之-------Android ProgressBar的使用!

    大家好,今天给大家讲一下Android中ProgressBar的使用,这个控件在开发中还是经常用到的,比如用户浏览网页的时候,中间肯定有个 传输过程,所以用进度条让用户耐心等待。再比如我在Android Market下载应用,它也会有进度条显示下载进度。我为什么要举这两个例子呢,是因为它…...

    2024/5/4 21:21:25

最新文章

  1. Amazon Q Business现已正式上市!利用生成式人工智能协助提高员工生产力

    在 2023 年度 AWS re:Invent 大会上&#xff0c;我们预览了 Amazon Q Business&#xff0c;这是一款基于生成式人工智能的助手&#xff0c;可以根据企业系统中的数据和信息回答问题、提供摘要、生成内容额安全地完成任务。 借助 Amazon Q Business&#xff0c;您可以部署安全、…...

    2024/5/7 18:19:27
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/5/7 10:36:02
  3. 使用Nginx搭载文件服务器

    1.进入nginx.conf的配置 带有alias别名的配置 location /root {alias /home/icore;autoindex on; } 带有别名&#xff1a;alias的路径 当访问ip:port/root 默认会直接进入到/home/icore , 浏览器显示的是/home/icore目录下的内容&#xff0c; 不带alias别名使用root的配置 …...

    2024/5/4 3:01:42
  4. Jenkins用户角色权限管理

    Jenkins作为一款强大的自动化构建与持续集成工具&#xff0c;用户角色权限管理是其功能体系中不可或缺的一环。有效的权限管理能确保项目的安全稳定&#xff0c;避免敏感信息泄露。 1、安装插件&#xff1a;Role-based Authorization Strategy 系统管理 > 插件管理 > 可…...

    2024/5/6 16:35:09
  5. Java-代理模式

    1、什么是代理模式 代理&#xff1a;自己不做&#xff0c;找别人帮你做 代理模式&#xff1a;在一个原有功能的基础上添加新的功能 分类&#xff1a;静态代理和动态代理 2、静态代理 原有方式&#xff1a;就是将核心业务和服务方法都编写在一起 package com.AE.service;p…...

    2024/5/1 16:02:10
  6. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/7 5:50:09
  7. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/7 9:45:25
  8. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/5/4 23:54:56
  9. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/7 14:25:14
  10. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/5/4 23:54:56
  11. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/5/4 23:55:05
  12. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/5/4 23:54:56
  13. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/5/7 11:36:39
  14. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/5/4 23:54:56
  15. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/6 1:40:42
  16. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/5/4 23:54:56
  17. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/5/4 23:55:17
  18. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/5/7 9:26:26
  19. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/5/4 23:54:56
  20. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/4 23:55:06
  21. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/5/5 8:13:33
  22. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/5/4 23:55:16
  23. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/5/4 23:54:58
  24. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/6 21:42:42
  25. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/5/4 23:54:56
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57