2016-04-10 99 views
0

我試圖將套接字連接從一個活動傳遞給另一個活動。這是我的代碼片段。無法將套接字從一個活動傳遞到另一個活動

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異常。 有人可以幫助我應該如何處理這個?

+0

你不能用'new'實例化一個'Activity'並讓它正常工作。即使可以,新實例也不會有與前一個實例相同的「Socket」。 –

+0

你解決了這個問題嗎? – Pooya

+0

我已經upvoted你的答案,我還沒有嘗試過呢!所以一旦我回來,就要把它標記正確。 –

回答

1

您需要使用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(); 
+0

嗨,我沒有得到單身模式類的一部分。我是否在一個新的java文件中創建它?或者將它與將建立服務器的活動放在一起? – Marcus

+0

每個公共具體類都需要位於單獨的.java文件中 – Pooya

0

我很抱歉地說,但你的代碼是一團糟,

原因

  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

  • 做你的任務在MainActivity,一旦你的任務完成了,使用的setResult方法設置的結果,
  • 參考此鏈接,

    http://stackoverflow.com/questions/920306/sending-data-back-to-the-main-activity-in-android

    +0

    謝謝你的建議,但是,我的問題沒有回答。 –

    +0

    正如我所提到的,套接字僅在線程中創建,所以當您創建一個新的MainActivity時,套接字對象的默認值爲null,您可以從MainActivity構造函數調用該線程,但仍然可以訪問該套接字對象只有線程創建它 – ThiyagaB

    0

    你可以很容易地做到這一點,創建和您的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(); 
        } 
    

    這會在運行時創建一個Singleton。當你去下一個活動,當你完成,當你關閉你的應用程序時,不要完成它。像這樣釋放sInstance,不要忘記這部分。

    sInstance = null; 
    
    相關問題