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

특정 함수 호툴 시 onReceive() 를 받은 후 return하는 법?

0 추천

안녕하세요, 앱 개발 도중에 궁금한게 있어서 글 남깁니다.

현재 액티비티 한개하고 클래스 한개 이렇게 두개가 있어요.

 

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		String response = new ReceiverClass(this)).getResult());
		Log.i("TEST",reponse);
	}
}

blic class Ma

public class ReceiverClass {
    public Context mContext;
	private CheckReceiver mReceiver;
	public static final String AUTHORITY = "com.br.test.INTENT";
	public static final String AUTHORITY2 = "com.br.test.GETDATA";
	public static String reponse = null;

		
    public ReceiverClass(Context context) {
    	mContext = context;
    	mReceiver = new CheckReceiver();
    	IntentFilter intentFilter = new IntentFilter();
    	intentFilter.addAction(AUTHORITY);
		
    	mContext.registerReceiver(mReceiver, intentFilter);
    	Intent intent = new Intent(AUTHORITY2);
    	mContext.startService(intent);
    }

    public String getResult() {
           return reponse;
    }
    
    class CheckReceiver extends BroadcastReceiver {
		@Override
		public void onReceive(Context context, Intent intent) {
			String action = intent.getAction();
			 if (AUTHORITY2.equals(action)) 
					reponse = ""+intent.getIntExtra("data", 0);
		}
	}

 

위와같이 위에 MainActivity에서 ReceiverClass의 onRecieve 에 들어오는 값을 

String response = new ReceiverClass(this)).getResult()); 이런식으로 받아오게 했거든요.

그런데 결과가 계속 null 이 나와서요..

일단 로그 찍어보니깐 onReceive() 에는 값이 제대로 들어오고 있고요..

MainActivity에서 위와같이 함수 호출하면 처음 넣은 null만 들어오는데,

아, BroadCast Receiver 에서 onReceive() 타기 전에 값을 리턴해서 그런가 보다,

값이 들어오기전까지 멈추는 thread를 쓰기도 하고 해 봤는데.. 잘 안되더라구요.

 

혹시 이 문제를 해결하는데 좋은 방법이 있을까요?

한드로이등 (810 포인트) 님이 2013년 5월 27일 질문

1개의 답변

+1 추천
브로드캐스트 리시버를 동기식으로 사용하려 하지 마세요.. (데이터가 들어올때까지 기다린다거나 무한루프 사용등...)

비동기를 위해 만들어진 만큼 수신시 동작코드를 브로드캐스트 리시버 상속클래스 내에서 추가해주시는게 맞습니다.
블랙넥원 (9,600 포인트) 님이 2013년 5월 27일 답변
안녕하세요, 답변 감사드려요.

좀 특수한 경우라서.. MainActivitiy 에서 함수 호출해서 곧바로 onReceive()를 타서 값을 뽑아내야 하거든요.. 아직 많이 부족해서.. 말씀하신 "수신시 동작코드를 브로드캐스트 리시버 상속클래스 내에서 추가해주시는게 맞습니다." 이 내용은 잘 이해가 가질 않네요.ㅠㅠ

구글링 끝에 registerReceiver를 Main Thread가 아닌 다른 Thread 로 돌리는 법을 알아내서 해결 하였습니다..

답변달아주셔서 감사드려요.
조금 이해하기 쉽게 설명 드리자면
A 가 B 에게 전달할 메세지가 있다고 합시다.
B 는 A 가 [언제] 메세지를 넘겨줄지 모릅니다.
B 는 A 에게 물어봅니다. - 나에게 온 메세지 있니? - 없어(null)
B 는 A 에게 10초후에 물어봅니다 - 나에게 온 메세지 있니? - 없어
B 는 A 에게 다시 10초후에 물어봅니다 - 나에게 온 메세지 있니? - 없어

이렇게 반복하는 코드는 상당한 자원낭비입니다.

A 가 B 에게 메세지를 넘겨야할 시점에 딱 한번만 통신해서 전달해주면 효율적이겠죠..

A 는 방송 (브로드캐스트) 합니다. - 메세지가 날라간다~
B 는 A 의 메세지를 수신후 처리합니다


혹시 위에 설명한것처럼 계속 물어보는 방식으로 쓰레드를 돌리고 있진 않나요 ?
맞습니다. A를 쓰레드로 돌리고, B도 역시 쓰레드로 돌려서
A에서 null이 아닌 값을 변수C에 넣으면B에서 계속 참고해서
C값이 바뀌면 값을 받아오게 했어요..

그런데 제가 A의 코드를 바꿀 수가 없는 상황이라서요..
B에서는 위에는 MainActivity로 되어있지만 실제로는 그냥 일반
Class이고요, 다른 Class에 의해서 딱 한번만 함수를 수행해야 합니다.
그리고 B는 파괴되어 사라지지요..

다른 좋은 방법이 있을까요?
메세지를 수신해서 전달해주는 (브로드캐스트 리시버를 상속받은 클래스) 코드를 수정할 수 없는 특수한 상황이라면 설명이 애매해지네요..
그 클래스를 수정해야 전체 구조를 바꿀 수 있을텐데요..
아니면 메세지가 필요한 클래스 (B) 에서 직접 브로드캐스트 리시버를 상속받은 클래스를 생성해서 등록하는건 어떨까요 ?
...