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;
	}

}



  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值