2012-06-07 31 views
5

私はAndroidにRESTクライアントを実装しています。 Serviceを使用してサーバーへの接続を実行し、操作の完了を通知するResultReceiverの例を見てきました。私はフラグメントからサービスを呼び出していますが、サービスが実行されている間に画面を回転しようとすると、ResultReceiverのgetActivity()メソッドは、おそらくそのフラグメントがもうレイアウトにないためにnullを返します。ResultReceiverは画面の回転に耐えられません

断片にコールバックメソッド

@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); 
     } 

    } 
} 

getActivity()戻るヌル。 これは正常ですか?画面の回転でも通知を許可するためにどのようなアプローチを使用できますか?ローカルブロードキャスト?

答えて

1

私はLocalBroadcastManagerを使用して登録BroadcastReceiverを使用していますし、それが正常に動作しています。それほど単純ではありませんでした。より良い解決策はありますか?

-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 
    public void onConfigurationChanged(Configuration newConfig) 
    { 
     // TODO Auto-generated method stub 
     super.onConfigurationChanged(newConfig); 
    } 
+2

答えをありがとう。実際には、私はそれを設定することはできませんので、レイアウトは風景モードでは異なるので、マニフェストで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" 

は解決策ではありません。向きの変更の上に保存

  • @Override 
    public void onSaveInstanceState(Bundle outState) { 
        outState.putParcelable(Consts.RECEIVER, mReceiver); 
        super.onSaveInstanceState(outState); 
    } 
    
  • 受信機のリセット: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クラスです:

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

関連する問題