Tags » Mvvm

Android开发中的MVVM模式实践

MVC, MVP and MVM

一个典型的MVC模式如下图所示:

MVC模式在实践中其实并不适合大规模Android应用的开发,因为Android从的设计上来说,activity/fragment更像是View层的组件和controller的结合,因为单纯的XML布局不能完成非常复杂的交互逻辑。工作项目由于一开始(2012年左右)的设计是MVC的,activity承担了view和controller的角色,工作中一个Activity耦合了展现层的逻辑和controller的逻辑后达到了4K+的行数,一个非常恐怖的数字。所以必须要对之进行解耦重构,其中MVP和MVVM引起了我们的注意,MVP模式见下图:

MVP模式是从MVC派生出来的,但是它阻止了model和view的交流,使业务逻辑与展示解耦,MVP模式中,activity承担的是View的角色,Presenter和VIew互相依赖(为了解耦有的时候会使用接口和抽象类,这个其实有点MVVM的意思了),Presenter是View和Model的一个桥梁。Presenter和View是一一对应的,是View的一种抽象。MVP模式在解耦的层面做的不如MVVM彻底。关于MVP模式的讨论可以参见这篇文章.

MVVM模式是在MVP模式上进一步解耦而派生出来的,见下图:

MVVM和MVP模式的区别在于View对于ViewModel来说是透明的,ViewModel对于Model来说是透明的,ViewModel持有View的回调,Model持有ViewModel的回调,这样就实现View,ViewModel,Model的解耦。

更多关于MVC, MVP, MVVM模式的讨论可以看一下这篇文章.

Demo

以一个点击button发送网络请求,并对结果进行处理的demo为例。
Activity的代码如下:

public class MVVMDemoActivity extends ActionBarActivity
    implements IViewModelCallback {

    MVVMDemoViewModel viewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mvvmdemo);

        viewModel = new MVVMDemoViewModel(this);
        findViewById(R.id.sendrequest).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                viewModel.action();
            }
        });
    }

    @Override
    public void onDataReceive() {
        //数据回来后进行视图的更新
    }

    @Override
    public void onError() {
        //数据请求失败的时候做一些处理
    }
}
… 90 more words
解耦

Using the MVVM Pattern to Implement a Single Core Multiple Client Architecture

When designing the Rumble platform, it was clear to us that we had to support a multitude of devices. Between the matrix of popular mobile platforms (iOS, Android, Window), the mobile web, different OS versions, aspect ratios and screen resolutions we realized this could quickly become a support and maintenance headache. 687 more words

Mobile App Architecture

Android开发中的MVVM模式实践

MVC, MVP and MVM

一个典型的MVC模式如下图所示:

MVC模式在实践中其实并不适合大规模Android应用的开发,因为Android从的设计上来说,activity/fragment更像是View层的组件和controller的结合,因为单纯的XML布局不能完成非常复杂的交互逻辑。工作项目由于一开始(2012年左右)的设计是MVC的,activity承担了view和controller的角色,工作中一个Activity耦合了展现层的逻辑和controller的逻辑后达到了4K+的行数,一个非常恐怖的数字。所以必须要对之进行解耦重构,其中MVP和MVVM引起了我们的注意,MVP模式见下图:

MVP模式是从MVC派生出来的,但是它阻止了model和view的交流,使业务逻辑与展示解耦,MVP模式中,activity承担的是View的角色,Presenter和VIew互相依赖(为了解耦有的时候会使用接口和抽象类,这个其实有点MVVM的意思了),Presenter是View和Model的一个桥梁。Presenter和View是一一对应的,是View的一种抽象。MVP模式在解耦的层面做的不如MVVM彻底。关于MVP模式的讨论可以参见这篇文章.

MVVM模式是在MVP模式上进一步解耦而派生出来的,见下图:

MVVM和MVP模式的区别在于View对于ViewModel来说是透明的,ViewModel对于Model来说是透明的,ViewModel持有View的回调,Model持有ViewModel的回调,这样就实现View,ViewModel,Model的解耦。

更多关于MVC, MVP, MVVM模式的讨论可以看一下这篇文章.

Demo

以一个点击button发送网络请求,并对结果进行处理的demo为例。
Activity的代码如下:

public class MVVMDemoActivity extends ActionBarActivity
    implements IViewModelCallback {

    MVVMDemoViewModel viewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mvvmdemo);

        viewModel = new MVVMDemoViewModel(this);
        findViewById(R.id.sendrequest).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                viewModel.action();
            }
        });
    }

    @Override
    public void onDataReceive() {
        //数据回来后进行视图的更新
    }

    @Override
    public void onError() {
        //数据请求失败的时候做一些处理
    }
}
… 90 more words
解耦

Creating a Circular Image in XAML

Here is a freeby – my preference for creating circular images in XAML:


<Grid x:Name="SingleImageContainer">
    <Ellipse Height="60" Width="60">
        <Ellipse.Fill>
            <ImageBrush ImageSource="{Binding MyImageUri}" AlignmentX="Center" AlignmentY="Center" />
        </Ellipse.Fill>
    </Ellipse>
 </Grid>

(sorry for the bad cropping)

MVVM

Organized Architecture for a Cross-Platform SignalR Application

SignalR is a great tool for keeping not only your web applications synced in real-time, but with it’s easy to use APIs for clients, it is perfect for use in your mobile applications. 1,108 more words

C#

Databinding a Windows FlipView with MVVM Light

MVVM Light is a great cross-platform MVVM Framework, and was chosen to be used in this example. However, it isn’t required to get the same results. 643 more words

C#

Mise à jour du plugin MvxForms vers sa version 1.2.0 incluant le support de Xamarin.Fomrs 1.4.2

Je viens juste de mettre à jour le plugin MvxForms vers sa version 1.2.0 incluant le support de Xamarin.Fomrs 1.4.2.

Ainsi, vous devriez pouvoir utiliser MvvmCross avec Xamarin.Forms sous: 70 more words

Mobile