마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

소켓 통신 중에 액티비티 전환 질문 드립니다.

0 추천

안녕하세요. 소켓 통신 중 서버에서 Download 메시지 수신시 다른 액티비티로 전환을 시키고 싶은데요.

현재 실행중인 액티비티는 MainActivity이고 아래 코드인 리시버가 쓰레드로 돌고 있습니다.

아래 "Download" 부분에 다른 액티비티로 전환하는 아래 코드가 삽입되어있었습니다.

Intent intent = new Intent(getApplicationContext(), SubActivity.class);

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

startActivity(intent);

그러나, 저 코드를 넣고 실행을 하게되면

android content contextwrapper getapplicationcontext() 오류를 발생시키며 앱이 죽어버립니다.

여기저기 찾아보니 getApplicationContext() 를 this로, 혹인 MainActivity.this로 바꿔라라고 써있는데,

아무래도 this를 넣게되면 코드에 오류는 없으나, this가 리시버 자체를 가리켜서 마찬가지로 죽어버리고

MainActivity.this는 받아들이질 못하네요...ㅠㅠ

 

어떻게 전환해야될지 난감합니다. 조언 부탁드릴게요.

public class MainActivity extends Activity {

    SocketService socket;    

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        socket = new SocketService();
        socket.connect();
}

 

public class SocketService {
	
	String ip;
	int port;
	Socket socket;
	DataOutputStream writer;
	DataInputStream reader;
	FileOutputStream fileWriter;
	FileInputStream fileReader;
	Thread receiver;
   
        //정책 하향 코드와, 생성자가 있습니다.


	//서버 연결
	public void connect() {
		final String tag = "CONNECT";
		
		try {
			socket = new Socket(ip, port);
			Log.d(tag, "서버 연결 성공");
			receiver = new Thread(new Receiver());
			receiver.start();
		} catch (UnknownHostException e) {
			Log.d(tag, e.getMessage());
		} catch (IOException e) {
			Log.d(tag, e.getMessage());
		}
	}
	
	//서버 연결 해제
	public void disconnect() {
		final String tag = "DISCONNECT";
		
		try {
			socket.close();
			Log.d(tag, "서버 연결 해제");
		} catch (IOException e) {
			Log.d(tag, e.getMessage());
		}
	}

	// 리시버 쓰레드
	class Receiver extends Activity implements Runnable {
		
		final String tag = "RECEIVER";
		String fileName;

		@Override
		public void run() {
			
			while(!socket.isClosed()) {
				
				if(socket.isClosed()) break;
				
				try {
					Log.d(tag, "Receiver Start");
					reader = new DataInputStream(socket.getInputStream());
					int len = reader.readInt();
					
					byte[] buf = new byte[len];
					reader.read(buf);
					String receiveMessage = new String(buf);
					Log.d(tag, receiveMessage);
				
					String[] buffer = receiveMessage.split("\\@");
					
					if(buffer[0].equals("Download")) {
						
						fileName = buffer[1];
						/*여기서 어떻게 해야할 지 모르겠습니다. */

					}//end else if
				} catch (IOException e) {
					Log.d(tag, e.getMessage());
				}//end try,catch
				}//end while
		}//end run
	}//end class Receiver
}//end class
공대냐 (170 포인트) 님이 2014년 11월 14일 질문

1개의 답변

0 추천
Activity를 상속받은 클래스 객체를 임의로 생성하면 정상동작하지 않습니다.

MainActivity 객체 레퍼런스를 SocketService 객체에 넘기는 구조로 수정하세요.
익명사용자 님이 2014년 11월 14일 답변
무슨 뜻인지 잘 이해가 안가는데 좀 더 자세히 설명해주실 수 있나요?
...