`

想在Android上用一下PureMVC,谁知结果……

 
阅读更多

我想用PureMVC for Java实现这样一个Android程序:点击按钮,在两个EditText中显示一些内容和点击总次数。

于是,我开始写了(当然这是我最后修改的正常版):

 

res/layout/main.xml:

 

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />

    <EditText
        android:id="@+id/editText1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:editable="false">
    </EditText>

    <EditText
        android:id="@+id/editText2"
        android:textColor="#FF0000"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:editable="false">
    </EditText>
    
    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button" />

</LinearLayout>
 

表面类:

 

 

package com.iteye.weimingtom.pmvc.test;

import org.puremvc.java.interfaces.IFacade;
import org.puremvc.java.patterns.facade.Facade;

import android.widget.EditText;

public class MyFacade extends Facade implements IFacade {
    public MyFacade() {
        this.registerCommand(SetTextCommand.NAME, new SetTextCommand());  
        this.registerMediator(new TextMediator());  
        this.registerMediator(new SimpleTextMediator()); 
        this.registerProxy(new MyProxy());
    }
    
    public void setupReceivers(EditText editText1, EditText editText2) {
    	((TextMediator) this.retrieveMediator(TextMediator.NAME)).setEditText(editText1);
    	((SimpleTextMediator) this.retrieveMediator(SimpleTextMediator.NAME)).setEditText(editText2);
    }
}
 

代理数据(共享数据)类:

 

 

 

package com.iteye.weimingtom.pmvc.test;

import org.puremvc.java.interfaces.IProxy;
import org.puremvc.java.patterns.proxy.Proxy;

public class MyProxy extends Proxy implements IProxy {
	public static final String NAME = "MyProxy";
	
	public MyProxy() {
		super(NAME, null);
	}
	
	public int clickNum = 0;

	public int getClickNum() {
		return clickNum;
	}

	public void setClickNum(int clickNum) {
		this.clickNum = clickNum;
	}
}

 

 

消息类:

 

 

package com.iteye.weimingtom.pmvc.test;

import org.puremvc.java.interfaces.ICommand;
import org.puremvc.java.interfaces.INotification;
import org.puremvc.java.patterns.command.SimpleCommand;

public class SetTextCommand extends SimpleCommand implements ICommand {
	public static final String NAME = "SET_TEXT_COMMAND";  
	
	@Override 
    public void execute(INotification n) { 
    	MyProxy proxy = (MyProxy)this.facade.retrieveProxy(MyProxy.NAME);  
    	proxy.setClickNum(proxy.getClickNum() + 1);  
    }
}

 

中介类(有两个):

 

 

package com.iteye.weimingtom.pmvc.test;

import org.puremvc.java.interfaces.IMediator;
import org.puremvc.java.interfaces.INotification;
import org.puremvc.java.patterns.mediator.Mediator;

import android.widget.EditText;

public class TextMediator extends Mediator implements IMediator {
	public final static String NAME = "TextMediator";
	
	private EditText editText;
	
	public TextMediator() {
		super(NAME, null);
	}
	
	public void setEditText(EditText editText) {
		this.editText = editText;
	}
	
    @Override 
    public String[] listNotificationInterests() {  
        return new String[]{
        	SetTextCommand.NAME
        };
    }
    
    @Override
    public void handleNotification(INotification n) {
        if (SetTextCommand.NAME.equals(n.getName())) {
        	if (this.editText != null) { 
	        	this.editText.setText(
	        			"name:" + n.getName() + "\n" + 
	        			"body:" + n.getBody() + "\n" + 
	        			"proxy data: clickNum = " + ((MyProxy)this.facade.retrieveProxy(MyProxy.NAME)).getClickNum());
        	}
        }
    } 
}

 

 

 

package com.iteye.weimingtom.pmvc.test;

import org.puremvc.java.interfaces.IMediator;
import org.puremvc.java.interfaces.INotification;
import org.puremvc.java.patterns.mediator.Mediator;

import android.widget.EditText;

public class SimpleTextMediator extends Mediator implements IMediator {
	public final static String NAME = "SimpleTextMediator";
	
	private EditText editText;
	
	public SimpleTextMediator() {
		super(NAME, null);
	}
	
	public void setEditText(EditText editText) {
		this.editText = editText;
	}
	
    @Override 
    public String[] listNotificationInterests() {  
        return new String[]{
        	SetTextCommand.NAME
        };
    }
    
    @Override
    public void handleNotification(INotification n) {
        if (SetTextCommand.NAME.equals(n.getName())) {
        	if (this.editText != null) { 
	        	this.editText.setText(
	        		"clickNum = " + ((MyProxy)this.facade.retrieveProxy(MyProxy.NAME)).getClickNum());
        	}
        }
    } 
}

 

对接到界面后:

 

 

package com.iteye.weimingtom.pmvc.test;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class PureMVCTestActivity extends Activity {
	private MyFacade facade = new MyFacade();
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
    	Button button1 = (Button) this.findViewById(R.id.button1);
    	EditText editText1 = (EditText) this.findViewById(R.id.editText1);
    	EditText editText2 = (EditText) this.findViewById(R.id.editText2);
        
    	facade.setupReceivers(editText1, editText2);
        
        button1.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				facade.sendNotification(SetTextCommand.NAME, "button1, onClick");
			}
        });
    }
}

 

 

最令我不解的是,如果直接把TextView引用传给registerMediator的TextMediator和SimpleTextMediator对象(作为它们的构造函数的参数),那么响应SetTextCommand的中介类所持有的TextView引用可能不是界面上的TextView引用,因为:

 

1. 在调试模式下,registerMediator传入的对象引用等于retrieveMediator得到的对象引用。

2. 在直接运行时,registerMediator传入的对象引用不等于retrieveMediator得到的对象引用。

 

所以,我用这种方式传递EditText引用。

 

    public MyFacade() {
        this.registerCommand(SetTextCommand.NAME, new SetTextCommand());  
        this.registerMediator(new TextMediator());  
        this.registerMediator(new SimpleTextMediator()); 
        this.registerProxy(new MyProxy());
    }
    
    public void setupReceivers(EditText editText1, EditText editText2) {
    	((TextMediator) this.retrieveMediator(TextMediator.NAME)).setEditText(editText1);
    	((SimpleTextMediator) this.retrieveMediator(SimpleTextMediator.NAME)).setEditText(editText2);
    }

 

 

而非在注册时传入:

 

 

//这样写可能有问题
    public MyFacade(EditText editText1, EditText editText2) {
        this.registerCommand(SetTextCommand.NAME, new SetTextCommand());  
        this.registerMediator(new TextMediator(editText1));  
        this.registerMediator(new SimpleTextMediator(editText2)); 
        this.registerProxy(new MyProxy());
    }
 

 

 

 

分享到:
评论

相关推荐

    Android中怎么使用PureMVC框架

    Android中怎么使用PureMVC框架

    PureMVC 中文版

    这份文档可能涵盖了如何在实际项目中有效使用PureMVC,包括如何定义和使用模型、视图和控制器组件,以及如何利用PureMVC的其他关键特性,如命令模式、通知系统和多层架构等。 PureMVC 的主要特点包括: 1. **多层...

    Lua实现PureMVC

    若是想使用,可以直接查看网上的pureMVC 文档,我并未对任何一个函数改名或者更换参数位置。 注意,这个PureMVC中的 class(ClassName, BaseName) 函数并不提供,因为此框架本意就是为了用于cocos2d-x-lua中。

    可以运行的puremvc的登陆实例.

    标题中的“可以运行的PureMVC的登陆实例”是指一个基于PureMVC框架的登录功能实现,这个实例已经经过验证可以在FlexBuilder3环境下正常运行。PureMVC是一种经典的多层应用架构模式,它为ActionScript、JavaScript、...

    Unity 专用 pureMVC

    在Unity中使用PureMVC,可以帮助开发者遵循良好的编程实践,提高代码的可读性和可维护性。同时,由于PureMVC框架的轻量级特性,对性能的影响较小,适合各种规模的游戏项目。通过理解并熟练运用PureMVC的各个组成部分...

    PureMvc实例 PureMvc第一个实例

    在这个名为"MyFirstPureMvc"的压缩包中,你将找到一个使用PureMvc开发的Adobe AIR项目的完整实例,这将帮助初学者理解如何在实际项目中应用PureMvc。 首先,让我们深入了解一下PureMvc的MVC架构: 1. **模型...

    qt版本pureMVC

    在Qt环境中,PureMVC提供了对C++语言的支持,使得开发者可以利用其强大的功能和面向对象的特性,同时利用PureMVC的组织结构。这个版本的PureMVC允许开发者更专注于业务逻辑,而不是关注如何把各个组件绑定在一起。 ...

    PureMVC.rar

    本压缩包"PureMVC.rar"提供了PureMVC在C#平台上的实现,包括单线程版和多线程版,适用于Unity开发或其他C#项目。 首先,我们来深入理解PureMVC的核心概念和架构: 1. **模型(Model)**:模型层负责应用程序的数据...

    PureMVC C#框架

    在"puremvc-csharp-standard-framework-master"这个压缩包中,你将找到PureMVC C#标准版的源代码,包括实现MVC模式的各种接口和类,以及示例应用,这些都是理解和使用PureMVC框架的关键资源。通过深入研究这些文件,...

    PureMVC中文教程

    标题中的“PureMVC中文教程”表明这是一份关于PureMVC框架的中文学习资料,主要面向想要理解和掌握这一框架的开发者。PureMVC是一个开源的、轻量级的、跨平台的MVC(Model-View-Controller)设计模式框架,它提供了...

    PureMVC.zip

    - 示例项目:可能包含一个简单的Unity项目,演示了如何在实际项目中使用PureMVC框架。 - 文档:可能有README或其他文档,解释如何在Unity项目中集成和使用PureMVC。 - 测试用例:可能包含测试代码,用于验证PureMVC...

    pureMVC源代码

    在你提供的压缩包中,"PureMvcDemo"可能是一个包含PureMVC框架示例应用的文件夹,用于帮助开发者理解如何在实际项目中使用PureMVC。 **纯MVC框架的核心概念** 1. **模型(Model)**:模型层负责处理应用程序的数据...

    cocoscreator使用puremvc

    在Cocos Creator中使用PureMVC,主要是为了实现更好的模块化、可维护性和可扩展性。PureMVC遵循模型-视图-控制器(Model-View-Controller)设计模式,通过将业务逻辑、用户界面和数据分离,提高了代码的组织结构和...

    pureMVC_AS3

    **纯MVC(PureMVC)AS3版详解** PureMVC是一款轻量级的框架,主要用于实现Model-View-Controller(MVC)设计模式。它最初由Dan Varga创建,旨在提供一种跨平台的解决方案,使开发人员能够更有效地组织和管理应用...

    PureMVC总结(附Hello World含PureMVC源码代码和文档)

    5. **应用场景与最佳实践**:PureMVC在实际项目中的使用场景,以及如何优化和扩展框架。 6. **Hello World示例**:通常会通过一个简单的“Hello World”程序来演示PureMVC的基本工作流程,展示如何创建并运行一个...

    puremvc开发指南

    标题 "PureMvc 开发指南" 指向的是一个关于 PureMVC 框架的教程或参考材料,这是一款广泛应用在多个平台上的轻量级、模块化、面向切面编程(AOP)的设计模式框架。PureMVC 提供了一种结构化的解决方案,帮助开发者在...

    PureMVC登陆例子

    《PureMVC登录示例详解》 在软件开发中,框架的选择往往对项目的架构和可维护性起到关键作用。PureMVC,一个轻量级、跨平台的MVC(Model-View-Controller)框架,因其简洁的设计和强大的组织能力,受到了许多开发者...

    PureMVC框架实例

    通过研究这些示例,你可以了解如何在实际项目中使用PureMVC,包括如何定义Proxy、Command、Mediator以及如何注册和调度它们。 总之,PureMVC框架为Flex开发提供了一种强大的组织结构,帮助开发者更好地管理代码,...

    PureMVC C++架构代码

    5. **Notification(通知)**:PureMVC使用`Notification`对象作为不同组件间通信的机制。`Notification`包含一个名字和可选的携带数据,可以被任何组件发送,并被任何监听者接收。 6. **MacroCommand(宏命令)**...

    基于PureMVC框架实现的Qt的一个例子

    通过阅读和分析PureMVC_Qt_example中的代码,你可以深入理解如何在C++环境中运用PureMVC,从而提升自己的软件开发技能。此外,还可以尝试扩展这个例子,添加更多功能,以加深对PureMVC和Qt集成的理解。

Global site tag (gtag.js) - Google Analytics