Android--Socket之单例模式

来源:互联网 发布:莫里斯迈斯纳 知乎 编辑:程序博客网 时间:2024/06/17 13:04

首先先来了解一下什么是单例模式?

单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。即一个类只有一个对象实例。

Java中单例模式定义:“一个类有且仅有一个实例,并且自行实例化向整个系统提供。”

Java单例模式例子

public class SingletonClass{    private static volatile SingletonClass instance=null;    public static SingletonClass getInstance(){            synchronized(SingletonClass.class){                if(instance==null){                    instance=new SingletonClass();                }            }        return instance;    }    private SingletonClass(){}}

优点

一、实例控制
单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。
二、灵活性
因为类控制了实例化过程,所以类可以灵活更改实例化过程。

缺点

一、开销
虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销。可以通过使用静态初始化解决此问题。
二、可能的开发混淆
使用单例对象(尤其在类库中定义的对象)时,开发人员必须记住自己不能使用new关键字实例化对象。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类。
三、对象生存期
不能解决删除单个对象的问题。在提供内存管理的语言中(例如基于.NET Framework的语言),只有单例类能够导致实例被取消分配,因为它包含对该实例的私有引用。在某些语言中(如 C++),其他类可以删除对象实例,但这样会导致单例类中出现悬浮引用。
单例模式详解:http://baike.baidu.com/link?url=1428jugDvmIt3sPaPLeuX0CxHKVXL8PZ-MIyeg7byC_YeBmV_XNkDALIc2ybNTAYND4sv8QYUgDCOwmWrwW-6c1pqhnBNIuXaMIS-ovYrPTgiIIAMPmZr89H9CB-N9Xe#6_1
接下来在Android中使用单例模式创建socket类

public class SocketUtil {    private static final String ADDRESS = SocketConstant.ADDRESS;    private static final int PORT = SocketConstant.PORT;    public static Socket socket = null;    public static BufferedReader br = null;    public static OutputStream out = null;    public static Activity activity = null;    /**     * 连接socket     *     * @throws IOException     */    public static void connectSocket() {        new Thread() {            public void run() {                try {                    Log.i("ConnectSocket", "进行连接服务端");                    socket = new Socket(ADDRESS, PORT);                    Log.i("ConnectSocket", "连接服务端成功");                    //获取输入输出流                    getSocketStream();                    //启动接受消息的线程                    startReadMsgThread();                    sendMsg("你好.好",1);                } catch (IOException e) {                    Log.i("ConnectSocket", "socket连接失败");                    e.printStackTrace();                }            }            /**             * 获取Socket通道输入、输出流,并在此将socket信息传到Bean中             *             * @throws IOException             */            public void getSocketStream() throws IOException {                // 获取socket通道的输入、输出流                // 将输入流放到buffer中,可以用readLine来读取信息                Log.i("ConnectSocket", "开始获取输入输出流");                out = socket.getOutputStream();                br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "gb2312"));                Log.i("ConnectSocket", "输入输出流获取完毕,out为:" + out + "br为:" + br);            }        }.start();    }    /**     * 调用接受服务端消息的方法,启动接受消息的线程     */    public static void startReadMsgThread() {        new Thread() {            public void run() {                Log.i("ConnectSocket", "接受消息的线程启动成功!!!");                while (true) {                    Log.i("ConnectScoket", "正在接受消息。。。。");                    try {                        Log.i("ServerToClient", br.readLine());//                    Intent intent = new Intent(activity, MainActivity.class);//                    activity.startActivity(intent);                    } catch (IOException e) {                        e.printStackTrace();                    }                }            }        }.start();    }    /**     * 启动发送消息的线程     * 将消息传入到编辑消息的方法中先进行预处理     *     * @param msg  未经过处理的消息内容     * @param type 消息类型     */    public static void sendMsg(String msg, int type) {        msg = new EditSendMsgDaoImpl().EditSendMsg(msg, type);        startSendMsgThread(msg);    }    /**     * 调用服务端发送消息的方法,启动发送消息的线程     */    public static void startSendMsgThread(String msg) {        final String sendMsg = msg;        new Thread() {            public void run() {                Log.i("ConnectSocket", "发送消息的进程启动!!!");                try {                    Log.i("EditSendMsg", sendMsg);                    out.write(sendMsg.getBytes());                    Log.i("ConnectSocket", "发送消息成功!!!");                } catch (IOException e) {                    e.printStackTrace();                }            }        }.start();    }    /**     * 设置进行跳转的activity     *     * @param activity 上下文的activity     */    public void setActivity(Activity activity) {        this.activity = activity;    }    /**     * 关闭socket     *     * @param socket     * @throws IOException     */    public static void closeSocket(Socket socket) throws IOException {        socket.close();    }    /**     * 关闭缓冲读取流     *     * @param br     * @throws IOException     */    public static void closeBufferedReader(BufferedReader br) throws IOException {        br.close();    }    /**     * 关闭输出流     *     * @param out     */    public static void closeOutputStream(OutputStream out) throws IOException {        out.close();    }}

使套接字,输入输出流都已static创建的好处就是在不同的类中都可以对Socket对象进行操作。



0 0
原创粉丝点击