2017-02-26 7 views
-1

저는 Android에서 작업 처리기가 어떻게 작동 하는지를 배우고 있습니다. 나는 안드로이드 서버와 소켓 클래스를했다. 누군가 서버에 연결하면 소켓에서 주 활동으로 메시지 (예 : "새 연결")를 보내려고합니다. 소켓에서 mainactivity로 전달하는 방법을 알아낼 수 없습니다. (주석 기타)어떻게 안드로이드에서 처리기를 통해 메시지를 전달할 수 있습니까?

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

당신이 다음 메시지 객체를 생성 obtainMessage를 사용하여 핸들러 스레드에서 데이터를 전송하려는 경우
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

.

handleMessage 및 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