我对 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/