java - Android:如何在所有 Activity 中与服务器建立公共(public)套接字连接

标签 java android sockets

我对 Android 还很陌生。如何与所有 Activity 都可用的服务器建立套接字连接,而不是在每个 Activity 中建立与同一服务器的连接?

在 MainActivity 中,我有一个正在运行的线程,但其他 Activity 无法访问该线程。

public class MainActivity extends Activity implements OnItemSelectedListener {
    private Socket socket;
    private static final int SERVERPORT = 8020;
    private static final String SERVER_IP = "192.168.1.36";

    public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);

         new Thread(new ServerThread()).start();
}

class ClientThread implements Runnable {
    private Socket socket;
    private static final int SERVERPORT = 8020;
    private static final String SERVER_IP = "192.168.1.36";

    @Override
    public void run() {
        try {
            InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
            socket = new Socket(serverAddr, SERVERPORT);
        } catch (UnknownHostException e1) {
                e1.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }
 }

如何与 192.168.1.36 上的服务器建立可用于所有 Activity 的相同连接,而不是在每个 Activity 上创建连接。

编辑答案

我创建了一个存储所有连接参数的类 包 com.example.clientmobile2;

 public class DataHolderClass {
 private static DataHolderClass dataObject = null;

 private DataHolderClass() {
 // left blank intentionally
 }

public static DataHolderClass getInstance() {
if (dataObject == null)
    dataObject = new DataHolderClass();
return dataObject;
}
private int server_port=8020;
private String server_ip="192.168.1.33";;

public int get_server_port() {
return server_port;
}


public String get_server_ip() {
return server_ip;
}

}

主要 Activity 如下:-

    public class MainActivity extends Activity implements OnItemSelectedListener {
    private static final int SERVERPORT = DataHolderClass.getInstance().get_server_port();
private static final String SERVER_IP = DataHolderClass.getInstance().get_server_ip();
     public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main); 
     }
     public void onClickon(View view) {
    Socket socket = null;
    try{

        InetAddress serverAddr = InetAddress.getByName(SERVER_IP);

        socket = new Socket(serverAddr, SERVERPORT);

    //sending the message to the linino as 0 to turn of the light
    PrintWriter out = new PrintWriter(new BufferedWriter(
            new OutputStreamWriter(socket.getOutputStream())),
            true);
    out.println("0"); 
    }
    catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
    try {
        socket.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
   }

每次我单击与 onClickOn 关联的按钮时,应用程序都会崩溃。

错误日志

05-08 10:38:40.171: E/AndroidRuntime(12909): FATAL EXCEPTION: main
05-08 10:38:40.171: E/AndroidRuntime(12909): Process: com.example.clientmobile2, PID: 12909
05-08 10:38:40.171: E/AndroidRuntime(12909): java.lang.IllegalStateException: Could not execute method of the activity
05-08 10:38:40.171: E/AndroidRuntime(12909):    at android.view.View$1.onClick(View.java:3841)
05-08 10:38:40.171: E/AndroidRuntime(12909):    at android.view.View.performClick(View.java:4456)
05-08 10:38:40.171: E/AndroidRuntime(12909):    at android.view.View$PerformClick.run(View.java:18462)
05-08 10:38:40.171: E/AndroidRuntime(12909):    at android.os.Handler.handleCallback(Handler.java:733)
05-08 10:38:40.171: E/AndroidRuntime(12909):    at android.os.Handler.dispatchMessage(Handler.java:95)
05-08 10:38:40.171: E/AndroidRuntime(12909):    at android.os.Looper.loop(Looper.java:136)
05-08 10:38:40.171: E/AndroidRuntime(12909):    at android.app.ActivityThread.main(ActivityThread.java:5102)
05-08 10:38:40.171: E/AndroidRuntime(12909):    at java.lang.reflect.Method.invokeNative(Native Method)
05-08 10:38:40.171: E/AndroidRuntime(12909):    at java.lang.reflect.Method.invoke(Method.java:515)
05-08 10:38:40.171: E/AndroidRuntime(12909):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
05-08 10:38:40.171: E/AndroidRuntime(12909):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
05-08 10:38:40.171: E/AndroidRuntime(12909):    at dalvik.system.NativeStart.main(Native Method)
05-08 10:38:40.171: E/AndroidRuntime(12909): Caused by: java.lang.reflect.InvocationTargetException
05-08 10:38:40.171: E/AndroidRuntime(12909):    at java.lang.reflect.Method.invokeNative(Native Method)
05-08 10:38:40.171: E/AndroidRuntime(12909):    at java.lang.reflect.Method.invoke(Method.java:515)
05-08 10:38:40.171: E/AndroidRuntime(12909):    at android.view.View$1.onClick(View.java:3836)
05-08 10:38:40.171: E/AndroidRuntime(12909):    ... 11 more
05-08 10:38:40.171: E/AndroidRuntime(12909): Caused by: java.lang.NullPointerException
05-08 10:38:40.171: E/AndroidRuntime(12909):    at com.example.clientmobile2.MainActivity.onClickon(MainActivity.java:331)

最佳答案

你可以创建一个singleton类并在那里定义该对象,或者使用android提供的application类,然后在那里定义你的套接字对象。然后你的对象将在所有 Activity 中均可访问。 read here如何使用Application类。

关于java - Android:如何在所有 Activity 中与服务器建立公共(public)套接字连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23532811/

相关文章:

java - 如何防止我的小部件在首次运行时更新?

java - Spring Boot 所需的请求部分 'file' 不存在

android - layout_margin 未从包含的 ImageView 继承

c - "accept"中断后恢复

java - Spring表单命令的意图

java - 无法更新/下载 Maven 项目的依赖项

javascript - React-Native headless (headless)怀疑

android - 使用Mediacodec和Motorola mobile发出音频编码问题

javascript - 断开连接时更新客户端中的用户列表

c++ - 配置OpenWrt进行socket编程的问题