zoukankan      html  css  js  c++  java
  • 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;
        }
    
    }
  • 相关阅读:
    git使用(1) --git本地基础操作
    openCV在ubuntu上的使用(0)
    x86汇编指令整理
    读书笔记--鸟哥的linux_2
    读书笔记--鸟哥的linux_1
    #转 c语言中.h文件的作用
    读书笔记--《java语言程序设计--基础篇》
    matlab plot
    关于天文中的坐标系的介绍
    FIR的学习1
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/5639590.html
Copyright © 2011-2022 走看看