• Android 中Observer模式的使用


    android实际上使用了大量的obverser 模式,最简单的就是onclicklistener,但是与一般的observer模式不同的是,view中定义了很多接口,如下所示:

     /**
         * Interface definition for a callback to be invoked when a touch event is
         * dispatched to this view. The callback will be invoked before the touch
         * event is given to the view.
         */
        public interface OnTouchListener {
            /**
             * Called when a touch event is dispatched to a view. This allows listeners to
             * get a chance to respond before the target view.
             *
             * @param v The view the touch event has been dispatched to.
             * @param event The MotionEvent object containing full information about
             *        the event.
             * @return True if the listener has consumed the event, false otherwise.
             */
            boolean onTouch(View v, MotionEvent event);
        }
    
        /**
         * Interface definition for a callback to be invoked when a view has been clicked and held.
         */
        public interface OnLongClickListener {
            /**
             * Called when a view has been clicked and held.
             *
             * @param v The view that was clicked and held.
             *
             * return True if the callback consumed the long click, false otherwise
             */
            boolean onLongClick(View v);
        }
    
        /**
         * Interface definition for a callback to be invoked when the focus state of
         * a view changed.
         */
        public interface OnFocusChangeListener {
            /**
             * Called when the focus state of a view has changed.
             *
             * @param v The view whose state has changed.
             * @param hasFocus The new focus state of v.
             */
            void onFocusChange(View v, boolean hasFocus);
        }
    
        /**
         * Interface definition for a callback to be invoked when a view is clicked.
         */
        public interface OnClickListener {
            /**
             * Called when a view has been clicked.
             *
             * @param v The view that was clicked.
             */
            void onClick(View v);
        }
    
        /**
         * Interface definition for a callback to be invoked when the context menu
         * for this view is being built.
         */
        public interface OnCreateContextMenuListener {
            /**
             * Called when the context menu for this view is being built. It is not
             * safe to hold onto the menu after this method returns.
             *
             * @param menu The context menu that is being built
             * @param v The view for which the context menu is being built
             * @param menuInfo Extra information about the item for which the
             *            context menu should be shown. This information will vary
             *            depending on the class of v.
             */
            void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo);
        }
    
    每个接口执行不同的操作。

    下面是一个相关的例子:
    package com.fp.app.looper;
    
    import com.fp.app.debug.DebugLog;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.View.OnFocusChangeListener;
    import android.widget.Button;
    
    public class Observer extends Activity implements OnClickListener ,OnFocusChangeListener{
    	public static final String TITLE = "title";
    
    	@Override
    	public void setTitle(int titleId) {
    		super.setTitle(titleId);
    	}
    
    	private Button btnMM;
    	private Button btnMS;
    	private Button btnSM;
    
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.entry);
    		findComponent();
    		setOnClickListener();
    		setOnFocusChangeListener();
    
    	}
    
    	private void setOnClickListener() {
    		btnMM.setOnClickListener(this);
    		btnMS.setOnClickListener(this);
    		btnSM.setOnClickListener(this);
    	}
    
    	
    	private void setOnFocusChangeListener() {
    		btnMM.setOnFocusChangeListener(this);
    		btnMS.setOnFocusChangeListener(this);
    		btnSM.setOnFocusChangeListener(this);
    	}
    	
    	private void findComponent() {
    		btnMM = (Button) this.findViewById(R.id.btn_mm);
    		btnMS = (Button) this.findViewById(R.id.btn_ms);
    		btnSM = (Button) this.findViewById(R.id.btn_sm);
    	}
    
    	@Override
    	public void onClick(View v) {
    		int id = v.getId();
    		switch (id) {
    		case R.id.btn_mm:
    			DebugLog.log("btnMM onclick");
    			break;
    		case R.id.btn_ms:
    			DebugLog.log("btnMS onclick");
    			break;
    		case R.id.btn_sm:
    			DebugLog.log("btnSM onclick");
    			break;
    		default:
    			break;
    		}
    
    	}
    
    	@Override
    	public void onFocusChange(View v, boolean hasFocus) {
    		int id = v.getId();
    		switch (id) {
    		case R.id.btn_mm:
    			DebugLog.log("btnMM onFocusChange");
    			break;
    		case R.id.btn_ms:
    			DebugLog.log("btnMS onFocusChange");
    			break;
    		case R.id.btn_sm:
    			DebugLog.log("btnSM onFocusChange");
    			break;
    		default:
    			break;
    		}
    		
    	}
    
    }
    

    package com.fp.app.debug;
    
    import java.io.PrintWriter;
    import java.io.StringWriter;
    import java.io.Writer;
    
    import android.util.Log;
    
    public class DebugLog {
    	public final static boolean DEBUG = true;
    
    	public static void log(String message) {
    		if (DEBUG) {
    			String fullClassName = Thread.currentThread().getStackTrace()[3].getClassName();
    			String className = fullClassName.substring(fullClassName.lastIndexOf(".") + 1);
    			String methodName = Thread.currentThread().getStackTrace()[3].getMethodName();
    			int lineNumber = Thread.currentThread().getStackTrace()[3].getLineNumber();
    
    			Log.d(className + "." + methodName + "():" + lineNumber, message);
    		}
    	}
    	
    	
    	public static void printThreadId(String message) {
    		if (DEBUG) {
    			Log.d(message, String.valueOf(Thread.currentThread().getId()));
    		}
    	}
    
    	public static void log(String tag, String message) {
    		if (DEBUG) {
    			String methodName = Thread.currentThread().getStackTrace()[3].getMethodName();
    			int lineNumber = Thread.currentThread().getStackTrace()[3].getLineNumber();
    
    			Log.d(tag + "." + methodName + "():" + lineNumber, message);
    		}
    	}
    
    	public static void printTrace(String message) {
    		if (DEBUG) {
    			printIllegalArgumentException("", message);
    		}
    	}
    
    	public static String getStackTrace(Throwable throwable) {
    		Writer writer = new StringWriter();
    		PrintWriter printWriter = new PrintWriter(writer);
    		throwable.printStackTrace(printWriter);
    		return writer.toString();
    	}
    
    	public static void printIllegalArgumentException(String tag, String arg) {
    		if (DEBUG) {
    			final Throwable throwable = new IllegalArgumentException(arg);
    			Log.w(tag, arg, throwable);
    		}
    	}
    
    }
    
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    	package="com.fp.app.looper" android:versionCode="1"
    	android:versionName="1.0">
    	<application android:icon="@drawable/icon" android:label="@string/app_name">
    		<activity android:name=".Observer" android:label="@string/app_name">
    			<intent-filter>
    				<action android:name="android.intent.action.MAIN" />
    				<category android:name="android.intent.category.LAUNCHER" />
    			</intent-filter>
    		</activity>
    	</application>
    </manifest> 
    
    <?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
        android:orientation="vertical"  
        android:layout_width="fill_parent"  
        android:layout_height="fill_parent"  
        >  
         
    <Button android:id="@+id/btn_mm"   
        android:layout_width="fill_parent"   
        android:layout_height="wrap_content"   
        android:text="main thread to main thread" />  
     <Button android:id="@+id/btn_ms"   
        android:layout_width="fill_parent"   
        android:layout_height="wrap_content"   
        android:text="main thread to sub thread" />  
       <Button android:id="@+id/btn_sm"   
        android:layout_width="fill_parent"   
        android:layout_height="wrap_content"   
        android:text="sub thread to main thread" />  
    </LinearLayout>  
    

  • 相关阅读:
    js面试相关
    邮件(一):Springboot+thymeleaf的发邮件部分
    饿了么组件--table组件自定义渲染列,同时伴有v-for和v-if情况
    java开发规范学习
    java发送邮件
    vue垂死挣扎--遇到的问题
    vue学习记录
    matlab---设置背景颜色为白色
    Git push时不需要总输入密码
    我不知道的js(一)作用域与闭包
  • 原文地址:https://www.cnblogs.com/budoudou/p/2101012.html
Copyright © 2020-2023  润新知