저는 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;
}
}
}
좋아, 메시지를 받고 메시지를 보내는 방법을 알고 있습니다 ... B 아직 프로젝트에서 한 클래스의 메시지를 다른 클래스로 전달하는 방법을 모르겠습니다. – Oneteil