2017-02-26 38 views
-1

我正在學習Android中的工作處理程序。我做了Android服務器和套接字類。當有人連接到服務器時,我希望從套接字發送一些消息(即「新連接」)到mainactivity。我無法弄清楚如何從socket傳遞給mainactivity。 (更多在評論)如何通過Android中的Handler傳遞消息?

HttpServerActivity.java

public class HttpServerActivity extends Activity implements OnClickListener{ 

private SocketServer s; 
private static final int READ_EXTERNAL_STORAGE = 1; 

Button btn1, btn2; 

// There I'm trying to send message to button, when somebody connected 
Handler h = new Handler(){ 
    @Override 
    public void handleMessage(Message msg){ 
     super.handleMessage(msg); 
     String text = (String)msg.obj; 
     btn1.setText(text); 
    } 
}; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_http_server); 

    Button btn1 = (Button)findViewById(R.id.button1); 
    Button btn2 = (Button)findViewById(R.id.button2); 

    btn1.setOnClickListener(this); 
    btn2.setOnClickListener(this); 

} 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.http_server, menu); 
    return true; 
} 


@Override 
public void onClick(View v) { 

    if (v.getId() == R.id.button1) { 

     int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE); 

     if (permissionCheck != PackageManager.PERMISSION_GRANTED) { 
      ActivityCompat.requestPermissions(
        this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, READ_EXTERNAL_STORAGE); 
     } else { 
      // I dont know figure out in this place 
      s = new SocketServer(h); 
      s.start(); 
     } 
    } 
    if (v.getId() == R.id.button2) { 
     s.close(); 
     try { 
      s.join(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    switch (requestCode) { 

     case READ_EXTERNAL_STORAGE: 
      if ((grantResults.length > 0) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) { 
       // I dont know figure out in this place 
       s = new SocketServer(h); 
       s.start(); 
      } 
      break; 

     default: 
      break; 
    } 
} 
} 

SocketServer.java

public class SocketServer extends Thread { 

private final Handler mHandler; 
public SocketServer(Handler handler) 
{ 
    mHandler = handler; 
} 
ServerSocket serverSocket; 
public final int port = 12345; 
boolean bRunning; 
public void close() { 
    try { 
     serverSocket.close(); 
    } catch (IOException e) { 
     Log.d("SERVER", "Error, probably interrupted in accept(), see log"); 
     e.printStackTrace(); 
    } 
    bRunning = false; 
} 

public Handler mHandler; 
public void run() { 
    try { 
     Log.d("SERVER", "Creating Socket"); 
     serverSocket = new ServerSocket(port); 
     bRunning = true; 
     while (bRunning) { 
      Log.d("SERVER", "Socket Waiting for connection"); 
      Socket s = serverSocket.accept(); 
      Log.d("SERVER", "Socket Accepted"); 

      // trying to send some message 
      String[] messageString = new String[1]; 

      Message message = Message.obtain(); 
      messageString[0]="OK"; 
      message.obj = messageString; 

      mHandler.sendMessage(message); 

      OutputStream o = s.getOutputStream(); 
      BufferedWriter out = new BufferedWriter(new OutputStreamWriter(o)); 

      out.write("HTTP/1.0 200 OK\n" + 
        "Date: Fri, 31 Dec 1999 23:59:59 GMT\n" + 
        "Content-Type: text/html\n" + 
        "Content-Length: 1354\n" + 
        "\n" + 
        "<html>\n" + 
        "<body>\n" + 
        "<h1> Connected </h1>\n" + 
        "</body>\n" + 
        "</html>"); 
      out.flush(); 


      while (!((tmp = in.readLine()).isEmpty())) 
      { 
       Log.d("Header", tmp); 
       if (tmp.startsWith("GET")) 
       { 
        getRequest = tmp; 
       } 
      } 

      s.close(); 
      Log.d("SERVER", "Socket Closed"); 

     } 
    } 
    catch (IOException e) { 
     if (serverSocket != null && serverSocket.isClosed()) 
      Log.d("SERVER", "Normal exit"); 
     else { 
      Log.d("SERVER", "Error"); 
      e.printStackTrace(); 
     } 
    } 
    finally { 
     serverSocket = null; 
     bRunning = false; 
    } 
} 

} 

回答

0

如果你打算從一個線程將數據發送到您的處理程序,然後使用obtainMessage創建消息對象。

您還必須使用處理程序的同一個實例來處理Message和sendMessage。


在這裏你會找到一個很好的資源解釋如何使用處理程序:

https://www.youtube.com/watch?v=LJ_pUlWzGsc

+0

好的,我知道如何獲取消息,併發送消息... B但我仍然不知道如何將消息從一個類傳遞給我的項目中的另一個類 – Oneteil

1

這是一個更大的項目,幾年前,我參與的一個樣本。您將無法按原樣運行,但我認爲您可以看到服務和活動之間的通信是如何工作的。隨意問如果有什麼不明確

服務

public class BluetoothService { 

    private final Handler mHandler; 

    public BluetoothService(Context context, Handler handler) { 

     mHandler = handler; 
    } 

    public synchronized void Connecting(...) { 

     ... 

     Message MenssageToActivity = mHandler.obtainMessage(Cliente_Bluetooth.MESSAGE_HELLO); 
     Bundle bundle = new Bundle(); 
     bundle.putString(BluetoothClient.DEVICE_NAME, " Gorkatan"); 
     MensajeParaActivity.setData(bundle); 
     mHandler.sendMessage(MensajeParaActivity); 

     ... 

    } 
} 

活動

public class BluetoothClient{ 

     public static final int MESSAGE_HELLO = 1; 
     public static final int MESSAGE_BYE = 2; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 

      mBluetoothService = new BluetoothService(this, mHandler); 
     } 

     private final Handler mHandler = new Handler() { 

      @Override 
      public void handleMessage(Message msg) { 
       switch (msg.what) { 


       case MESSAGE_HELLO: 

        String mName = null; 
        mName = msg.getData().getString(DEVICE_NAME); 

        Toast.makeText(getApplicationContext(), "Hello "+ mName, Toast.LENGTH_SHORT).show(); 

       break; 

       case MESSAGE_BYE: 

        System.out.println("Bye!") 

       break; 


} 

這是整個項目(這已經得到了意見和變量名在西班牙語):

https://github.com/ignacio-alorre/PDF-Dispenser/tree/master/Client/Cliente_Bluetooth/src/com/cliente_bluetooth