2012-06-07 3 views
5

Android에서 REST 클라이언트를 구현 중입니다. Service을 사용하여 서버에 연결하고 작업 완료를 알리는 ResultReceiver을 사용한 예를 보았습니다. 프래그먼트에서 서비스를 호출 할 때 서비스가 실행되는 동안 화면을 회전하려고하면 ResultReceiver의 getActivity() 메소드가 null이 반환됩니다. 아마 그 프래그먼트가 더 이상 레이아웃에 없기 때문일 수 있습니다.ResultReceiver가 화면 회전에 영향을주지 않습니다.

단편의 콜백 방법

getActivity() 복귀를 null
@Override 
public void onReceiveResult(int resultCode, Bundle resultData) { 
    Response response = (Response) resultData 
      .getSerializable(RestService.RESULT); 
    if (resultCode == RestService.SUCCESS 
      && response != null) { 
     if (getActivity() != null) { 
      recommendationResponse = response; 
      getLoaderManager().restartLoader(0, new Bundle(), 
        Fragment.this); 
     } 

    } 
} 

. 정상입니까? 화면 회전에서도 알림을 허용하기 위해 어떤 접근 방식을 사용할 수 있습니까? 로컬 방송?

답변

1

나는 BroadcastReceiverLocalBroadcastManager를 사용하여 등록 사용하고하고 올바르게 작동. 그것은 그렇게 간단하지 않았습니다. 더 나은 해결책이 존재합니까?

-1

getActivity()는 null을 반환합니다. 이게 정상인가?

Android 순환은 기기 순환 후 다시 생성됩니다.

활동이 다시 후에는 보유하지 않는 오래된 context.that의 이유를 null로 getActivity()를 받고 심지어 화면 회전에 통지를 허용하는 데 사용할 수있는 어떤 방법

? 로컬 방송? 당신이
 <activity 
      android:name=".MyActivity" 
      android:configChanges="orientation" <<<<<<<<< 
      android:label="@string/app_name" 
      android:screenOrientation="portrait" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

매니페스트

에 다음과 같은 화면 rotation.mention에 다시 그리고 마지막으로 활동을 싶지 않는 경우

당신은 활동에 다음과 오버라이드 (override) 할 것이다.

@Override 
    public void onConfigurationChanged(Configuration newConfig) 
    { 
     // TODO Auto-generated method stub 
     super.onConfigurationChanged(newConfig); 
    } 
+2

답변 해 주셔서 감사합니다. 실제로 레이아웃을 가로 모드에서 다르기 때문에 manifest에 screenOrientation을 설정하지 않기를 원합니다. 그래서 설정할 수 없습니다. – Matroska

1

나는 동일한 문제를 발견하고 내 ResultReceiver의 onReceivedResult 메소드에서 NULL을 확인하여 해결했다고 생각합니다. 여기에 게시 코드는

protected void onReceiveResult(int resultCode, Bundle resultData) { 
      //Verify activity 
      if(getActivity() != null){ 
       //Handle result 
      }else{ 
       notificationPending = true;     
      } 
     } 

notificationPending 플래그 활동이 발견되지 않은 경우 조각이 보류 통지를 유지하는 데 도움이 (활동에서 사용할 수 없습니다 (UI와에서 onCreate에서 setRetainInstance (참)없이 조각) 작업자 조각에서 작동 단편 분리). 조각이 활동에 다시 연결하면

은 내가

public void onAttach(Activity activity){ 
    super.onAttach(activity); 
     if(notificationPending){ 
      //Handle notification 
      notificationPending = false; 
     } 
} 

는 희망이 도움이 논리를 수행합니다. 원하는 경우 세부 정보를 요청할 수 있습니다. 건배

12

아니,

android:configChanges="orientation" 

는 해결책이 아니다.방향 변경에 저장

  • :

    는 ResultReceiver I을 사용하려면

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
        Bundle savedInstanceState) { 
    
        if (savedInstanceState != null) { 
         mReceiver = savedInstanceState.getParcelable(Consts.RECEIVER); 
        } 
        else { 
         mReceiver = new MyResultReceiver(new Handler()); 
        } 
        mReceiver.setReceiver(this); 
    } 
    
    여기

내 ResultReceiver 클래스입니다 :

@Override 
public void onSaveInstanceState(Bundle outState) { 
    outState.putParcelable(Consts.RECEIVER, mReceiver); 
    super.onSaveInstanceState(outState); 
} 
  • 수신기를 재설정 :

    import android.os.Bundle; 
    import android.os.Handler; 
    import android.os.ResultReceiver; 
    
    public class MyResultReceiver extends ResultReceiver { 
        private Receiver mReceiver; 
    
        public MyResultReceiver(Handler handler) { 
         super(handler); 
        } 
    
        public void setReceiver(Receiver receiver) { 
         mReceiver = receiver; 
        } 
    
        public interface Receiver { 
         public void onReceiveResult(int command, Bundle resultData); 
        } 
    
        @Override 
        protected void onReceiveResult(int command, Bundle resultData) { 
         if (mReceiver != null) { 
          mReceiver.onReceiveResult(command, resultData); 
         } 
        } 
    } 
    
  • +0

    Brilliant! 나는 [ResultReceiver] (http://developer.android.com/reference/android/os/ResultReceiver.html)와 관련된 많은 다른 유사한 질문들 (많은 상향 회선들과 함께)을 보았고, 그들 중 누구도 그러한 빈번한 시나리오를 활동으로 성공적으로 다루었습니다 휴양. – villoren

    +0

    getParcelable()을 호출 할 때 onCreateView()에서 ClassCastException을 피하는 방법은 무엇입니까? 하위 클래스가 Parcelable.CREATOR를 구현하지 않아 getParcelable()이 ResultReceiver 인스턴스 (하위 클래스의 인스턴스가 아닌)를 반환하지 않습니까? – Alan

    +0

    @ Alan 제 테스트를 통해 장치를 회전 시키면 위의 방법이 작동합니다. 그러나 안드로이드가 백그라운드에서 앱을 종료하고 다시 시작하면 onCreateView()에서 ClassCastException이 발생합니다. 왜 확신 할 수 없지만 이것이 내 테스트에서 발견 한 것입니다 ... – Micro

    관련 문제