안녕하세요. TCP 연결을 사용하여 C++ 서버에 연결된 안드로이드 응용 프로그램이 있습니다. 첫 번째 활동으로 사용자는 서버와 연결하기 위해 IP 주소와 포트를 쓸 수 있습니다. 그러면이 활동은 인 텐트를 사용하여 다른 활동을 호출합니다. 두 번째 작업은 소켓 연결을 수행하고 몇 개의 스레드를 실행합니다.활동을 닫을 때 활성 스레드 및 소켓을 중지하는 방법
두 번째 활동에는 연결 해제 버튼도 있습니다. 그 버튼을 누를 때, 은 실행중인 모든 스레드를 멈추고 소켓 연결을 닫은 다음 다시 활성 상태 인으로 이동하여 필요한 경우 다시 연결하도록합니다. 그렇게 할 수 없었습니다. socket.close()
으로 시도했지만 내 스레드가 접히고 다시 연결할 수 없습니다. 나는 또한 this.onDestroy();
또는 this.finish()
으로 시도했다; 활동이 닫히지 만 여전히 서버에 연결되어 있습니다.
작업을 마치면 모든 스레드와 소켓을 끝내고 이전 작업으로 돌아갈 수 있습니까?
첫 번째 활동 : 비동기 작업에 대한
public class FirstActivity extends Activity {
EditText editTextAddress, editTextPort;
Button buttonConnect, buttonClear;
Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ipclient);
editTextAddress = (EditText)findViewById(R.id.address);
editTextPort = (EditText)findViewById(R.id.port);
buttonConnect = (Button)findViewById(R.id.connect);
}
public void onClickConnect(View v){
String ip=editTextAddress.getText().toString();
int port=Integer.valueOf(editTextPort.getText().toString());
intent=new Intent(this,SecondActivity.class);
Bundle extrasB=new Bundle();
extrasB.putString("ip",ip);
extrasB.putInt("port",port);
intent.putExtras(extrasB);
startActivity(intent);
}
}
SecondActivity
public class SecondActivity extends Activity {
....
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_client_late);
.....
updateConversationHandler = new Handler();
new Thread(new ClientThread()).start();
sendImage=new SendImage();
sendImage.execute();
}
public class SendImage extends AsyncTask<Void,Void,Void>{
@Override
protected Void doInBackground(Void... arg0){
.....
}
}
class ClientThread implements Runnable {
@Override
public void run() {
thread1=Thread.currentThread();
try {
InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
socket = new Socket(serverAddr, SERVERPORT);
socketTE = new Socket(serverAddr, SERVERPORT);
CommunicationThread commThread = new CommunicationThread(socketTE);
new Thread(commThread).start();
} catch (UnknownHostException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
class CommunicationThread implements Runnable
{
private Socket clientSocket;
private BufferedReader input;
public CommunicationThread(Socket clientSocket)
{
thread2=Thread.currentThread();
this.clientSocket = clientSocket;
....
}
public void run()
{
while (!Thread.currentThread().isInterrupted())
{
.....
}
}
}
class updateUIThread implements Runnable
{
private String msg;
public updateUIThread(String str)
{
thread3=Thread.currentThread();
...
}
@Override
public void run()
{
....
}
}
**public void disconnectButtonOnCLick(View v) throws IOException{
super.onStop();
super.finish();
}**
@Override
protected void onDestroy() {
super.onDestroy();
sendImage.cancel(true);
thread1.interrupt();
thread2.interrupt();
thread3.interrupt();
try {
socket.close();
socketTE.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
어디서 onPause 메서드를 호출해야합니까? – Dany19
명시 적으로 onPause를 호출하지 않았습니다. 자동으로 호출됩니다. http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle – Mike
편집을위한 mike 감사합니다. – erik