多activity使用同一socket

来源:互联网 发布:python 依赖注入 编辑:程序博客网 时间:2024/06/06 02:15

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

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 0
原创粉丝点击