多activity使用同一socket

解决这个问题大抵有三种方法:

1、使用单例模式

2、将socket封装在service中

3、application实体类

前两种方法,Stackflow上有较多的实现方式,但个人认为短时间内较难上手,而且不方便及时处理接收到的信息

所以我们来讨论一下第三种方法

这种方法的实质,我认为就是把socket当做一个全局变量

1、首先,实现MySocket类

public class MySocket extends Application{
    Socket socket = null;
    public Socket getSocket(){
        return socket;
    }
    public void setSocket(Socket socket){
        this.socket = socket;
    }
}

setSocket()是在第一次在某个activity中socket初始化后,将其保存下来

getSocket(),其他的acticity中调用,便可获得之前建立过的socket,从而达到共享目的

2、设置AndroidManifest.xml

<application
    android:name=".MySocket"     <!-设置application实体类->
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">

3、首次初始化socket(这也算是比较优良的在Android中实现socket的例子)

 Socket socket = null;
    BufferedReader reader = null;
    BufferedWriter writer = null;

    public void connect() {

        AsyncTask<Void, String, Void> read = new AsyncTask<Void, String, Void>() {

            @Override
            protected Void doInBackground(Void... arg0) {
                try {
                    socket = new Socket("120.77.244.212", 11332);
                    writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                    reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    publishProgress("@success");
                    ((MySocket)getApplication()).setSocket(socket);
                } catch (UnknownHostException e1) {
                    //Toast.makeText(Client.this, "无法建立链接", Toast.LENGTH_SHORT).show();
                } catch (IOException e1) {
                    //Toast.makeText(Client.this, "无法建立链接", Toast.LENGTH_SHORT).show();
                }


                try {
                    String line;
                    while ((line = reader.readLine()) != null) {
                        publishProgress(line);
                    }
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                return null;

            }

            @Override
            protected void onProgressUpdate(String... values) {
                if (values[0].contains("@success")) {
                    Toast.makeText(secondActivity.this,"链接成功!", Toast.LENGTH_SHORT).show();

                }
                super.onProgressUpdate(values);
            }
        };
        read.execute();

    }

    public void send(String order) {
        try {
            writer.write(order + "\n");
            writer.flush();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

我加粗的那行代码,((MySocket)getApplication()).setSocket(socket); 首次初始化后socket,赋值给全局

4、在其他activity中再调用

 socket = ((MySocket)getApplication()).getSocket();
 writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
 reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

大致上就是如此,可以较为便捷的实现我们的目的。此外再提醒一点,别忘了在AndroidManifest.xml中添加各种需要的权限

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值