热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Android观察者模式实例分析

这篇文章主要介绍了Android观察者模式,实例分析了Android观察者模式的原理与相关使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例讲述了Android观察者模式。分享给大家供大家参考。具体分析如下:

一、环境:

主机:WIN8
开发环境:Eclipse

二、说明:

1.打开sd卡中的xml文件,如果不存在,这新建一个,并写入默认配置
2.读取xml文件
3.Config_Info.java为配置信息数据结构
4.IF_Config.java为配置类的存取接口,其他类可以通过此接口直接获取配置信息
5.IF_Subject_Config.java为观察者模式目标类接口
6.IF_Observer_Config.java为观察者模式观察者类接口
7.Config.java为配置类,完成1,2两部工作,同时是观察者模式的目标类,一旦配置信息由变化着通知观察者类
8.TestClass.java为观察者模式的观察者
通过存取接口+观察者模式可以实现松耦合的设计。

三、xml文件格式:

<&#63;xml version="1.0" encoding="UTF-8" standalOne="true"&#63;> 
- 
 
12600 
10.58.1.59
12601 

四、源代码:

Config_Info.java:

/** 
 * 配置信息数据类型 
 * 新建时间:2014/12/8 by jdh 
 */ 
package com.example.helloanychat; 
public class Config_Info { 
 //标题 
 public String title; 
 //本机ip 
 public String local_ip; 
 //本机端口 
 public int local_port; 
 //调度服务器ip 
 public String schedule_server_ip; 
 //调度服务器端口 
 public int schedule_server_port; 
}

IF_Config.java:

/** 
 * 接口:配置类,读写 
 * 新建时间:2014/12/8 by jdh 
 */ 
package com.example.helloanychat; 
public interface IF_Config { 
 public Config_Info get_config_info(); 
}

IF_Subject_Config.java:

/** 
 * 接口:配置类,观察者模式:目标 
 * 新建时间:2014/12/8 by jdh 
 */ 
package com.example.helloanychat; 
public interface IF_Subject_Config { 
 public void register_observer(IF_Observer_Config observer); 
 public void remove_observer(IF_Observer_Config observer); 
 public void notify_observer(); 
}

IF_Observer_Config.java:

/** 
 * 接口:配置类,观察者模式:观察者 
 * 新建时间:2014/12/8 by jdh 
 */ 
package com.example.helloanychat; 
public interface IF_Observer_Config { 
 public void update(Config_Info info); 
}

Config.java:

/** 
 * 配置信息类 
 * 新建日期:2014/12/8 by jdh 
 * 修改日期:2014/12/9 by jdh 
 */ 
package com.example.helloanychat; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.StringWriter; 
import java.net.Inet6Address; 
import java.net.InetAddress; 
import java.net.NetworkInterface; 
import java.net.SocketException; 
import java.util.ArrayList; 
import java.util.Enumeration; 
import java.util.List; 
import java.util.Timer; 
import java.util.TimerTask; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import android.os.Environment; 
import android.util.Log; 
import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.w3c.dom.NodeList; 
import org.xmlpull.v1.XmlPullParserFactory; 
import org.xmlpull.v1.XmlSerializer; 
public class Config implements IF_Config,IF_Subject_Config { 
 //配置信息 
 private Config_Info Info = new Config_Info(); 
 //存储观察者的列表 
 private List Observers = new ArrayList(); 
 //定时器 
 private Timer Timer_Work = new Timer(); 
 //工作间隔,单位:ms 
 private final int INTERVAL_WORK = 5000; 
 /** 
 * 构造函数 
 */ 
 public Config() { 
 //生成配置信息 
 generate_config_info(); 
 //创建定时线程 
 Timer_Work.schedule(new Task(),INTERVAL_WORK,INTERVAL_WORK);
 // 定时任务 
 } 
 //接口:读写 
 @Override 
 public Config_Info get_config_info() { 
 return Info; 
 } 
 //读写,观察者模式:目标 
 @Override 
 public void register_observer(IF_Observer_Config observer) { 
 Observers.add(observer); 
 } 
 @Override 
 public void remove_observer(IF_Observer_Config observer) { 
 int index = Observers.indexOf(observer); 
 if (index >= 0) { 
  Observers.remove(observer); 
 } 
 } 
 @Override 
 public void notify_observer() { 
 for (int i = 0; i  en = NetworkInterface 
   .getNetworkInterfaces(); en.hasMoreElements();) { 
  NetworkInterface intf = en.nextElement(); 
  for (Enumeration enumIpAddr = intf 
   .getInetAddresses(); enumIpAddr.hasMoreElements();) { 
   InetAddress inetAddress = enumIpAddr.nextElement(); 
   //if (!inetAddress.isLoopbackAddress()) { 
   if (!inetAddress.isLoopbackAddress() && !(inetAddress instanceof Inet6Address)) { 
   return inetAddress.getHostAddress().toString(); 
   } 
  } 
  } 
 } catch (SocketException ex) { 
  Log.e("WifiPreference IpAddress", ex.toString()); 
 } 
 return null; 
 } 
 /** 
 * 生成xml配置文件的String数据流 
 * Config_Info的本机ip信息不会保存 
 * @param info:配置信息 
 * @return xml的String数据流 
 */ 
 private String produce_xml_string(Config_Info info) { 
 StringWriter stringWriter = new StringWriter(); 
 try { 
  // 获取XmlSerializer对象 
  XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); 
  XmlSerializer xmlSerializer = factory.newSerializer(); 
  // 设置输出流对象 
  xmlSerializer.setOutput(stringWriter); 
  //开始标签 
  xmlSerializer.startDocument("utf-8", true); 
  xmlSerializer.startTag(null, "config"); 
  //标题 
  xmlSerializer.startTag(null, "title"); 
  xmlSerializer.text(info.title); 
  xmlSerializer.endTag(null, "title"); 
  //本机端口 
  xmlSerializer.startTag(null, "local_port"); 
  xmlSerializer.text(Integer.toString(info.local_port)); 
  xmlSerializer.endTag(null, "local_port"); 
  //调度服务器ip 
  xmlSerializer.startTag(null, "schedule_service_ip"); 
  xmlSerializer.text(info.schedule_server_ip); 
  xmlSerializer.endTag(null, "schedule_service_ip"); 
  //调度服务器端口 
  xmlSerializer.startTag(null, "schedule_service_port"); 
  xmlSerializer.text(Integer.toString(info.schedule_server_port)); 
  xmlSerializer.endTag(null, "schedule_service_port"); 
  xmlSerializer.endTag(null, "config"); 
  xmlSerializer.endDocument(); 
 } catch (Exception e) { 
  e.printStackTrace(); 
 } 
 return stringWriter.toString(); 
 } 
 /** 
 * 工作任务:得到配置信息 
 */ 
 private void generate_config_info() 
 { 
 boolean ok; 
 File sd_path; 
 File file_cfg_dir; 
 File file_cfg; 
 FileOutputStream out; 
 String str; 
 FileInputStream in; 
 Config_Info info = new Config_Info(); 
 //得到本机ip地址 
 info.local_ip = getLocalIpAddress(); 
 //获取SD卡目录 
 sd_path = Environment.getExternalStorageDirectory(); 
 //判断文件夹是否存在 
 file_cfg_dir = new File(sd_path.getPath() + "//Remote_Meeting"); 
 if (!file_cfg_dir.exists() && !file_cfg_dir.isDirectory()) { 
  System.out.println("配置文件夹Remote_Meeting不存在!"); 
  ok = file_cfg_dir.mkdirs(); 
  if (ok) { 
  System.out.println("创建文件夹成功!");
  } else { 
  System.out.println("创建文件夹失败!");
  } 
 } 
 //判断配置文件是否存在 
 file_cfg = new File(file_cfg_dir.getPath(),"cfg.xml"); 
 if (!file_cfg.exists()) 
 { 
  System.out.println("配置文件cfg.xml不存在!"); 
  try { 
  file_cfg.createNewFile(); 
  System.out.println("创建文件cfg.xml成功!"); 
  //生成初始化的配置数据 
  try { 
   out = new FileOutputStream(file_cfg); 
   //保存默认配置 
   Info.title = "远程视频会见系统"; 
   Info.local_port = 12600; 
   Info.schedule_server_ip = "10.58.1.59"; 
   Info.schedule_server_port = 12601; 
   str = produce_xml_string(Info); 
   out.write(str.getBytes()); 
   out.close(); 
   //保存本机ip 
   Info.local_ip = info.local_ip; 
   //通知观察者 
   notify_observer(); 
  } catch (IOException e) { 
   // TODO Auto-generated catch block 
   e.printStackTrace(); 
  } 
  } catch (IOException e) { 
  // TODO Auto-generated catch block 
  e.printStackTrace(); 
  } 
 } 
 else 
 { 
  //解析xml文件 
  try { 
  in = new FileInputStream(file_cfg); 
  DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
  DocumentBuilder builder = factory.newDocumentBuilder(); 
  Document document = builder.parse(in); 
  // 获取根节点 
  Element root = document.getDocumentElement(); 
  NodeList node = root.getChildNodes(); 
  //获得第1子节点:标题 
  info.title = node.item(0).getFirstChild().getNodeValue(); 
  //获得第2子节点:本机端口 
  info.local_port = Integer.parseInt(node.item(1).getFirstChild().getNodeValue()); 
  //获得第3子节点:调度服务器ip 
  info.schedule_server_ip = node.item(2).getFirstChild().getNodeValue(); 
  //获得第4子节点:调度服务器端口 
  info.schedule_server_port = Integer.parseInt(node.item(3).getFirstChild().getNodeValue()); 
  //判断配置信息是否变更 
  do 
  { 
   if (!info.title.equals(Info.title)) 
   { 
   break; 
   } 
   if (!info.local_ip.equals(Info.local_ip)) 
   { 
   break; 
   } 
   if (info.local_port != Info.local_port) 
   { 
   break; 
   } 
   if (!info.schedule_server_ip.equals(Info.schedule_server_ip)) 
   { 
   break; 
   } 
   if (info.schedule_server_port != Info.schedule_server_port) 
   { 
   break; 
   } 
   //全部相同 
   return; 
  } while (false); 
  //赋值 
  Info.title = info.title; 
  Info.local_ip = info.local_ip; 
  Info.local_port = info.local_port; 
  Info.schedule_server_ip = info.schedule_server_ip; 
  Info.schedule_server_port = info.schedule_server_port; 
  //通知观察者 
  notify_observer(); 
  } catch (Exception e) { 
  e.printStackTrace(); 
  } 
 } 
 } 
 /** 
 * 定时器线程定时工作 
 */ 
 private class Task extends TimerTask { 
 @Override 
 public void run() { 
  generate_config_info(); 
 } 
 } 
}

TestClass.java:

package com.example.helloanychat; 
public class TestClass implements IF_Observer_Config { 
 public TestClass () { 
 } 
 @Override 
 public void update(Config_Info info) { 
 System.out.printf("-------------更新数据:%s,%s,%d,%s,%d\n", 
 info.title,info.local_ip,info.local_port,info.schedule_server_ip,info.schedule_server_port); 
 } 
}

MainActivity:

TestClass testclass = new TestClass(); 
Config cOnfig= new Config(); 
mEditIP.setText(config.get_config_info().local_ip); 
config.register_observer(testclass); 

希望本文所述对大家的Android程序设计有所帮助。


推荐阅读
  • Java EE CDI:解决依赖关系冲突的实例
    在本教程中,我们将探讨如何在Java EE的CDI(上下文和依赖注入)框架中有效解决依赖关系的冲突问题。通过学习如何使用限定符,您将能够为应用程序的不同客户端提供多种接口实现,并确保每个客户端都能正确调用其所需的实现。 ... [详细]
  • Android中解析XML文件的实践指南
    本文详细介绍了在Android应用开发中解析XML文件的方法,包括从本地文件和网络资源获取XML文件的不同途径,以及使用DOM、SAX和PULL三种解析方式的具体实现。 ... [详细]
  • ServletContext接口在Java Web开发中扮演着重要角色,它提供了一种方式来获取关于整个Web应用程序的信息。通过ServletContext,开发者可以访问初始化参数、共享数据以及应用资源。 ... [详细]
  • 本文提供了详细的步骤,介绍如何将基于Maven的Java EE项目从Eclipse IDE部署到JBoss应用服务器上。适合初学者和中级开发者参考。 ... [详细]
  • JavaWeb技术架构解析
    本文探讨了JavaWeb开发中客户端与服务器端的交互模式,重点分析了B/S(浏览器/服务器)和C/S(客户端/服务器)两种架构的特点及应用场景。 ... [详细]
  • 本文详细介绍了如何使用 PHP 编程语言输出 99 乘法表,包括使用不同的循环结构如 do-while、for 循环等方法,并提供了具体的代码示例。 ... [详细]
  • 详解 | 日志系统ViseLog的基本使用与功能
    本文详细介绍了日志系统ViseLog的使用方法及其核心功能,旨在帮助开发者更好地理解和利用这一工具,提高开发效率。 ... [详细]
  • 本文探讨了使用Filter作为控制器的优势,以及Servlet与Filter之间的主要差异。同时,详细解析了Servlet的工作流程及其生命周期,以及ServletConfig与ServletContext的区别与应用场景。 ... [详细]
  • 本文介绍了如何使用Gradle和gdx-setup.jar工具来创建LibGDX项目,包括详细的步骤和注意事项,适合初学者和有经验的开发者。 ... [详细]
  • Flowable 6.6.0 表单引擎在Web应用中的集成与使用
    本文档提供了Flowable 6.6.0版本中表单引擎在Web应用程序中的配置和使用指南,包括表单引擎的初始化、配置以及在Web环境下的具体实现方法。 ... [详细]
  • MyEclipse技巧:高效生成toString方法
    本文将介绍如何在MyEclipse中快速且高效地生成toString方法,帮助开发者简化编码过程,提高开发效率。 ... [详细]
  • 本文总结了WebSphere应用服务器出现宕机问题的解决方法,重点讨论了关键参数的调整,包括数据源连接池、线程池设置以及JVM堆大小等,旨在提升系统的稳定性和性能。 ... [详细]
  • 使用Jenkins构建Java项目实践指南
    本指南详细介绍了如何使用Jenkins构建Java项目,包括环境搭建、工具配置以及项目构建的具体步骤。 ... [详细]
  • 本文探讨了如何在 Spring 3 MVC 应用程序中配置 MySQL 数据库连接,通过 XML 配置实现 JDBC 直接操作数据库,而不使用 Hibernate 等额外框架。 ... [详细]
  • 基于Spring Boot的家政服务平台毕业设计项目(含源代码)
    本文档介绍了如何搭建和运行一个基于Spring Boot的家政服务平台,旨在为计算机专业学生提供毕业设计参考。项目涵盖了从环境配置到核心功能实现的全过程。 ... [详细]
author-avatar
唐进水566673
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有