[英]Unable to pass socket from one Activity to another
我試圖將套接字連接從一種活動傳遞到另一種活動。 這是我的代碼段。
public class MainActivity extends AppCompatActivity {
//private EditText serverIp;
private Button connectPhones;
protected String SERVER_IP_ADDR = "172.16.1.103";
protected String SERVER_PORT = "8889";
private boolean connected = false;
private Handler handler = new Handler();
Socket socket;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//serverIp = (EditText) findViewById(R.id.server_ip);
connectPhones = (Button) findViewById(R.id.connect);
connectPhones.setOnClickListener(connectListener);
}
public Socket getSocket(){
Log.wtf("MainActivity : ",socket.toString());
return socket;
}
private View.OnClickListener connectListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!connected) {
//SERVER_IP_ADDR = SERVER_IP_ADDR.getText().toString();
if (!SERVER_IP_ADDR.equals("")) {
Thread cThread = new Thread(new ClientThread());
cThread.start();
}
}
}
};
public class ClientThread implements Runnable {
public void run() {
try {
InetAddress serverAddr = InetAddress.getByName(SERVER_IP_ADDR);
Log.d("ClientActivity", "C: Connecting...");
socket = new Socket(serverAddr, Integer.parseInt(SERVER_PORT));
connected = true;
try {
Log.d("ClientActivity", "C: Sending command.");
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket
.getOutputStream())), true);
out.println("Hey Server!");
Log.d("ClientActivity", "C: Sent.");
Intent intent = new Intent(getApplicationContext(), SocketInteraction.class);
startActivityForResult(intent,1);
} catch (Exception e) {
Log.e("ClientActivity", "S: Error", e);
}
//socket.close();
Log.d("ClientActivity", "C: Closed.");
} catch (Exception e) {
Log.e("ClientActivity", "C: Error", e);
connected = false;
}
}
}
}
在其他活動中,我這樣稱呼它
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.socketinteraction);
MainActivity mainActivity = new MainActivity();
final Socket socket = mainActivity.getSocket(); //returns null pointer
但是我不知道為什么,它返回一個Nullpointerexception。 有人可以幫我解決這個問題嗎?
您需要使用Singleton
模式類,如下所示:
public class SocketSingleton {
private static Socket socket;
public static void setSocket(Socket _socket){
SocketSingleton.socket=_socket;
}
public static Socket getSocket(){
return SocketSingleton.socket;
}
然后在您的MainActivity
使用以下命令:
SocketSingleton.setSocket(socket);
Intent i = new Intent(getActivity().getApplicationContext(), NewActivity.class);
startActivity(intent);
最后在您的NewActivity
使用以下命令:
Socket socket = SocketSingleton.getSocket();
抱歉,您的代碼很混亂,
原因
我們不應該創建一個活動的實例,它是在android框架中創建的工作,我們只能啟動一個活動。
第二個活動具有不同的布局“ socketinteraction”,並且用於創建套接字的代碼是在MainActivity布局中的按鈕單擊偵聽器中編寫的。
您可能想做這樣的事情,
從您的其他活動中,
點擊按鈕后,開始如下所示的維護活動,
startActivityForResult(new Intent(this,MainActivity.class),0)
並始終使用Intent在活動之間進行交流。 請參閱此鏈接, http://developer.android.com/training/basics/intents/result.html
參考此鏈接,
http://stackoverflow.com/questions/920306/sending-data-back-to-the-main-activity-in-android
您可以很容易地做到這一點,像這樣創建和創建MainActivity實例。
public class MainActivity extends Activity {
public static MainActivity sInstance = null;
protected void onCreate(Bundle bundle) {
super.onCreate(...);
setContentView(...);
sInstance = this;
}
}
現在,在您的其他活動中,您可以像這樣簡單地調用它。
if (MainActivity.sInstance != null) {
final Socket socket = MainActivity.sInstance.getSocket();
}
這會在您的MainActivity運行時為其創建一個Singleton。 只是當您轉到下一個活動,完成時以及關閉應用程序時,不要完成它。 像這樣釋放sInstance,不要忘記這一部分。
sInstance = null;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.