2014-09-29 4 views
-1

내 안드로이드 앱이 서버와 통신해야합니다. 따라서 액티비티는 인 텐트를 생성하고 IntentService 파생 상품을 시작합니다.Android : ResultReceiver 참조가 사라지는 이유는 무엇입니까?

this one과 같은 힌트 다음에 나는 응답을 처리하기 위해 ResultReceiver를 확장했습니다. 내 액티비티는 포함 된 Receiver 인터페이스를 구현하므로 (onReceiveResult를 구현합니다).

public class MyResultDistributor extends ResultReceiver { 

// Class instances serves one purpose: To remember who gets the answer. 
private Receiver mReceiver; 

// Constructor: Apparently, the "handler" determines in which thread the result handling is done. 
public MytResultDistributor(Handler handler) { 
    super(handler); 
} 

// This is what the receiver of request answers has to implement. 
public interface Receiver { 
    public void onReceiveResult(int resultCode, Bundle resultData); 
} 

// Allows to clarify who is the receiver of request results. 
public void setReceiver(Receiver receiver) { 
    if (receiver != null) { 
     Log.d(this.getClass().toString(), "Setting receiver."); 
    } else { 
     Log.d(this.getClass().toString(), "Unsetting receiver."); 
    } 
    this.mReceiver = receiver; 
    if (this.mReceiver != null) { 
     Log.d(this.getClass().toString(), "Set receiver."); 
    } else { 
     Log.d(this.getClass().toString(), "Unset receiver."); 
    } 
} 

@Override 
protected void onReceiveResult(int resultCode, Bundle resultData) { 
    // Anybody interested in the results? Well, then feel free to take them. 
    Log.d(this.getClass().toString(), "Got result."); 
    if (this.mReceiver != null) { 
     Log.d(this.getClass().toString(), "Distributing result."); 
     this.mReceiver.onReceiveResult(resultCode, resultData); 
    } else { 
     Log.d(this.getClass().toString(), "No receiver there."); 
    } 
} 

활동이의 인스턴스를 생성하고, 수신기 (발췌)로 자신을 설정합니다

public class MainActivity extends Activity implements MyResultDistributor.Receiver { 

public MyResultDistributor mDistributor; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Log.v(this.getClass().toString(), "onCreate"); 
    setContentView(R.layout.activity_main); 

    mDistributor = new MyResultDistributor(new Handler()); 
    mDistributor.setReceiver(this); 

    (...) 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    Log.v(this.getClass().toString(), "onPause"); 
    mDistributor.setReceiver(null); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    Log.v(this.getClass().toString(), "onResume"); 
    mDistributor.setReceiver(this); 
} 

(...) 

을 지금, 나는이 작업을 실행할 때, 내 서비스를 시작하고, 그 결과를 반환을 mReceiver이 null 인 것 같습니다. 하지만 로그에서 null로 설정되는 것을 볼 수는 없습니다. "

로그 발췌 : 지난 5 메시지가 다른 TID 기능

onCreate 
Setting receiver. 
Set receiver. 
onResume 
Setting receiver. 
Set receiver. 
Request Service was created. 
Request Service has got an Intent. 
Server answer: auth 
Authenticated! 
Got result. 
No receiver there. 

.

수신자가 한 가지 방법으로 설정되어 나타나고 다른 하나에서 설정이 해제되는 이유는 무엇입니까? 스레드 문제가 있습니까? new Handler()을 사용하여 문제가 생겼을 수 있습니까?

어떤 힌트를 부탁드립니다.

답변

1

좋아, 내 실수를 찾았 어. 나는 틀린 수신기를 내 IntentService로 어떻게 든 넘겼다. 그래서 나는보고있는 인스턴스가 다른 것을 보았다. 해결할 수없는 질문에 사과드립니다 ... (해당 코드 부분이 표시되지 않았기 때문에).