簡體   English   中英

無法將套接字從一個活動傳遞到另一個活動

[英]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();

抱歉,您的代碼很混亂,

原因

  1. 我們不應該創建一個活動的實例,它是在android框架中創建的工作,我們只能啟動一個活動。

  2. 第二個活動具有不同的布局“ socketinteraction”,並且用於創建套接字的代碼是在MainActivity布局中的按鈕單擊偵聽器中編寫的。

您可能想做這樣的事情,

從您的其他活動中,

  1. 在布局“ socketinteraction”中添加一個按鈕
  2. 點擊按鈕后,開始如下所示的維護活動,

    startActivityForResult(new Intent(this,MainActivity.class),0)

並始終使用Intent在活動之間進行交流。 請參閱此鏈接, http://developer.android.com/training/basics/intents/result.html

  1. 在MainActivity中完成任務,完成工作后,請使用setResult方法設置Result,

參考此鏈接,

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM