2014-07-16 3 views
2

안녕하세요. 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(); 
    } 
} 

} 

답변

1

:

@Override 
    public void onPause(){ 
     super.onPause(); 
     if (sendImage!=null) { 
      sendImage.cancel(true); 
      } 
} 

것은 여기 명확하게하는 것은 내 코드입니다

+0

어디서 onPause 메서드를 호출해야합니까? – Dany19

+0

명시 적으로 onPause를 호출하지 않았습니다. 자동으로 호출됩니다. http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle – Mike

+0

편집을위한 mike 감사합니다. – erik

1

우선, this.onDestroy()를 명시 적으로 호출하면 안됩니다. 액티비티를 닫으려면 finish()를 호출해야합니다. onDestroy()는 acvitity가 파기 될 때 호출되는 콜백입니다. onCreate()와 같이 onDestroy를 재정의해야합니다.

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    // close all your threads 
} 

초. 모든 스레드를 닫으려면이 스레드를 살펴볼 수 있습니다 - android best and safe way to stop thread. 부울 변수를 사용하여 스레드가 중지되었는지 여부를 나타낼 수도 있습니다. public static boolean isStopped;Malcolm 위의 링크와 같습니다. 소켓을 닫는 방법 - How can a socket be both connected and closed?. 희망이 도움이됩니다.

관련 문제