以前对Java中的观察者模式只知道一点皮毛,在接触Android的过程中,逐渐认识到观察者模式是如此的重要,android中许多地方都用到了观察者模式例如ContentResolver操作,来总结一下android中观察者模式的使用技巧
我所理解的观察者模式是这样子的::
以一个例子来说明: 在service中有一个int类型的数据i,我在service中启动一个定时器去不断更新这个值,当我在activity中启动这个服务一次之后,每当i变化的时候我的activity要自动的同步更新这个值来显示
1:观察者主体 >> 接口
定义这个接口的目的就是处理数据的变化,当数据变化的时候就放到我们的参数中
一般我们定义该接口的时候将我们感兴趣的数据作为方法中的参数【例如我们关心一个location那么参数就为一个Location类型或是一个数据库中总数的变化则参数就是一个int类型】
2: 观察者操作者 >> 接口对象
//service中 public static InfoChangeObserver observer; // 非service public InfoChangeObserver observer;
public void setObserver(InfoChangeObserver o){ this.observer = o; }
3:观察者使用者 >> 给接口对象赋值
由于在service中我们不能直接new 一个service对象,因此我们一般将接口对象定义为一个static类型,在activity中通过MyService.observer = this来直接赋值[前提是你的activity实现了观察者主体接口];除此之外,我们都会通过观察者操作者提供的setCurrentObserver(InfoChangeObserver obsler)来赋值
接下来时源码:
Interface 接口:
package com.example.performclickk; public interface InfoChangeObserver
{
public int onDataChanged(int i); }
Service
package com.example.performclickk; import java.util.Timer;
import java.util.TimerTask; import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log; public class MyService extends Service
{ // 监听者对象
public static InfoChangeObserver observer; @Override
public void onCreate()
{
// TODO Auto-generated method stub
Log.i( "ser", "MyService onCreate" );
super.onCreate();
} // 监视的变量
int i = ; Timer timer; TimerTask task; @Override
public void onStart(Intent intent, int startId)
{
timer = new Timer();
task = new TimerTask()
{ @Override
public void run()
{
// TODO Auto-generated method stub
try
{
// 模拟长连接操作
Thread.sleep( );
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
i++;
// 监听者监听数据变化,把变化的数据放到onDataChanged(i)中去
if (observer != null)
{
observer.onDataChanged( i );
}
}
};
timer.schedule( task, , ); super.onStart( intent, startId );
} @Override
public IBinder onBind(Intent intent)
{
// TODO Auto-generated method stub
return null;
}
}
3:使用者 Activity
package com.example.performclickk; import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;
import java.util.zip.Deflater; import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.HttpVersion;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.ContentBody;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.CoreProtocolPNames;
import org.apache.http.util.EntityUtils; import android.os.Bundle;
import android.os.Environment;
import android.os.Handler.Callback;
import android.os.IBinder;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnDismissListener;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.DialogInterface.OnClickListener;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.Toast; public class MainActivity extends Activity implements android.view.View.OnClickListener, InfoChangeObserver
{
Button button1, button2; Context context;
// ceshi
int i = ; @Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate( savedInstanceState );
setContentView( R.layout.activity_main );
context = this;
MyService.observer = this;
button1 = (Button) findViewById( R.id.button1 );
button2 = (Button) findViewById( R.id.button2 );
button1.setOnClickListener( this );
button2.setOnClickListener( this ); } @Override
public void onClick(View v)
{
switch (v.getId())
{
case R.id.button1:
//数据会不断变化
Log.i( "tag", i+"");
break;
case R.id.button2:
//启动服务
Intent intent = new Intent( MainActivity.this, MyService.class );
intent.setAction( "com.example.performclickk.service" );
startService( intent );
break;
default:
break;
} } //监听最新的数据
@Override
public void onDataChanged(int i)
{ return this.i = i;
} }
Android中观察者模式的升入理解的更多相关文章
-
Android中9-Patch图片之理解
在android中,不仅可以将扩展名为.png,.jpg,.gif的普通图片作为图片资源,而且可以将扩展名为.9.png的9-Patch图片作为图片资源.扩展名为.png,.jpg,.gif的普通图片 ...
-
Android中pendingIntent的深入理解
pendingIntent字面意义:等待的,未决定的Intent.要得到一个pendingIntent对象,使用方法类的静态方法 getActivity(Context, int, Intent, i ...
-
对Android中的堆栈的理解(Stack)
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Ln_ZooFa/article/details/50337529 堆栈空间分配 栈(操作系统): ...
-
Android中layout_weight的属性理解
https://www.zybuluo.com/zzudhj/note/102067 在Android开发过程中,在编写布局文件经常会用layout_weight属性:从字面意思上看权重.比值.按比例 ...
-
android中Logcat的深层理解
Android的开发也能够归类为嵌入式设备的开发.即便不是嵌入式开发,依旧要注意对内存和处理的使用.养成一个好的习惯对自己的帮助是非常大的. 在Log的源代码中能够看到这种凝视: The order ...
-
关于Android中RemoveView的错误理解
我以前一直以为,一个View被removeView了之后,就会被回收.其实不是这样的.如果有人引用它. 它还是会存在的.removeView和View被回收没有必然的关系.一个View被removeV ...
-
对Android中dp单位的理解
dp 设备独立像素 ,也叫dip, device independent pixle. 比如同样在1英寸大小的屏幕上,高密度的屏幕可显示100个像素点,而低密度的屏幕只能70个点. 用了dp之后,只要 ...
-
Android中Cursor(游标)类的概念和用法
使用过 SQLite 数据库的童鞋对 Cursor 应该不陌生,如果你是搞.net 开发你大可以把Cursor理解成 Ado.net 中的数据集合相当于dataReader.今天特地将它单独拿出来谈, ...
-
android中的Cursor类
转载: 使用过 SQLite 数据库的童鞋对 Cursor 应该不陌生,如果你是搞.net 开发你大可以把Cursor理解成 Ado.net 中的数据集合相当于dataReader.今天特地将它单独拿 ...
随机推荐
-
Jsp与servlet本质上的区别
1.jsp经编译后就变成了Servlet.(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类)2.jsp更擅长 ...
-
Bimmap 成像用bitblt 缩放问题
BitBlt不能变尺寸,但是StrectchBlt可以变尺寸,在使用StrectchBlt时要注意,首先要设置一下SetStretchBltMode,通常设成HALFTONE,这样缩放时就不会失真. ...
-
JavaEE基础(六)
1.面向对象(面向对象思想概述) A:面向过程思想概述 第一步 第二步 B:面向对象思想概述 找对象(第一步,第二步) C:举例 买煎饼果子 洗衣服 D:面向对象思想特点 a:是一种更符合我们思想习惯 ...
-
php unserialize 返回false的解决方法
php 提供serialize(序列化) 与unserialize(反序列化)方法. 使用serialize序列化后,再使用unserialize反序列化就可以获取原来的数据.(改表结构或者进行下面操 ...
-
距离矢量路由协议举例——RIP
1. 工作原理 •RIP 是一种分布式的基于距离矢量的路由选择协议. •RIP 协议要求网络中的每个路由器都要维护从它自己到其它每个目的网络的距离记录. •RIP 协议中的"距离" ...
-
[Usaco2008 Jan]Cow Contest奶牛的比赛[神奇的FLOYD]
Description FJ的N(1 <= N <= 100)头奶牛们最近参加了场程序设计竞赛:).在赛场上,奶牛们按1..N依次编号.每头奶牛的编程能力不尽相同,并且没有哪两头奶牛的水平 ...
-
XCode 出现 is missing from working copy文件一直红色情况解决方法
解决方案:1.打开终端2.cd 到警告所提示的文件夹下3.执行命令svn rm 丢失文件的名称4.回车
-
fetch默认不携带cookie
最近在使用fetch向服务器发送请求,过程中的体会和遇到的问题在这里记录一下. fetch返回的是一个Promise对象,我们可以对返回的结果做进一步的处理,这是与传统ajax的一个区别. 简单的请求 ...
-
Android 关于arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容问题
Android 设备的CPU类型(通常称为”ABIs”) 引用: https://blog.csdn.net/ouyang_peng/article/details/51168072 armeabiv ...
-
Angular4.x 中的服务
Angular4.x 中的服务 写下前面 学习angular4.x中的服务需要借助 ToDoList 项目来做,项目代码在上篇博客中讲到. https://www.cnblogs.com/wjw101 ...