Android--Socket之单例模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/M_WBCG/article/details/70801020

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

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

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++),其他类可以删除对象实例,但这样会导致单例类中出现悬浮引用。
接下来在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对象进行操作。



猜你喜欢

转载自blog.csdn.net/M_WBCG/article/details/70801020