Android中观察者模式的升入理解
Posted 星辰
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android中观察者模式的升入理解相关的知识,希望对你有一定的参考价值。
以前对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 = 0; 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( 2000 ); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } i++; // 监听者监听数据变化,把变化的数据放到onDataChanged(i)中去 if (observer != null) { observer.onDataChanged( i ); } } }; timer.schedule( task, 0, 2000 ); 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 = 0; @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中TextView文本内容发生变化为背景
设计模式 观察者模式 以Android中TextView文本内容发生变化为背景
是否有在单个活动中处理多个片段的 Android 设计模式?
设计模式 行为型模式 -- 观察者模式(发布-订阅(Publish/Subscribe)模式)