2

私のActivityVolleyリクエストを行うと、私はダイアログフラグメントを持つダイアログを表示します。そしてActivityの非static内部クラスで応答ハンドラー、で、私はとの対話の断片を却下:私は、デバイスを回転させない限り、方向変更後にダイアログフラグメントを破棄するVolley resopnseハンドラ

@Override 
public void onResponse(String response) { 
    MyActivity.this.takeAwayTheDialog(); 
} 

物事はうまく動作します。オリエンテーションの変更が完了した後で応答が返ってくると、MyActivity.thisはすでに破壊されています。

考えられる解決策は次のとおり姿勢変更

  • は、ネットワーク要求
  • を処理するために、しかし、彼らは満足見ていない別の保持の断片を使用する前に

    1. が要求をキャンセルします。私は、アクティビティが再作成され、正しいリソースがロードされるように、システムが私の向きを扱うことを可能にするソリューションを持っていたいと思います。誰も上記の2つのソリューションについてコメントしたり、他の提案をしたりできますか?どうも。誰もがこれをまだ答えていないので

    +0

    特定のアクティビティのマニフェストで、 'android:configChanges =" orientation "を定義できます。つまり、アクティビティを再開しません。 –

    +0

    'onOrientationChanged'関数を簡単にオーバーライドして、向きの変更後に必要な変更を加えることができます。前回のボレーのリクエストを停止した後に、再度リクエストがあったかもしれません。 –

    +0

    @NigamPatro、 'android:configChanges =" orientation "'を使用しないでください。 [docs](https://developer.android.com/guide/topics/manifest/activity-element.html#config)から*この属性を使用することは避け、最後の手段としてのみ使用してください*詳細については、[this](http://stackoverflow.com/a/7990543/2666212)の回答をご覧ください。 – Mike

    答えて

    0

    、私はあなたのソリューションで私の意見を書きます:

    1. (多分あなたの活動のonPause()中)姿勢変更前の要求をキャンセルし、オリエンテーション後に再度開始変更(おそらくonResume())は簡単な解決策になりますが、サーバーに要求を2回送信することができます。

      これは通常問題ではありませんが、要求がPOSTなどのようにユーザーに署名するリクエストでは、オリエンテーション変更後のユーザー名が既に存在するというエラーが表示されることがありますサーバーに正常に署名しています.2番目のアクティビティは、もう一度署名しようとしています)。

      Volleyが(サーバーが適切なヘッダーを送信した場合)Volleyが最初の要求の応答を透過的にキャッシュする可能性があるため、このソリューションは静かにうまく動作します。あたかも超高速接続をしているかのように応答してください。 。 。

    2. 保持されているヘッドレスのフラグメントを使用して、その中からボレーのリクエストを開始し、現在のアクティビティにコールバックするのがかなりうまくいく、と私は考えています。は、アクティビティが再作成され、正しいリソースがロードされます、その後、現在のアクティビティがレスポンスを取得してユーザに表示します。

      私がこのソリューションで考えることができる唯一の欠点は、多くの定型的なコードが書かれていることです。ダイアログを表示して非表示にする方法です。

      public class MainActivity extends AppCompatActivity{ 
      
          public static class MainActivityHeadlessFragment extends Fragment { 
      
           private MainActivity mActivity; 
           public MainActivityHeadlessFragment() { 
            // Required empty public constructor 
           } 
      
      
      
           @Override 
           public void onCreate(@Nullable Bundle savedInstanceState) { 
            super.onCreate(savedInstanceState); 
            setRetainInstance(true); 
           } 
      
           public void ShowDialog() { 
            DialogFragment newFragment = SampleDialogFragment.newInstance(); 
            newFragment.show(mActivity.getSupportFragmentManager(), "sample_dialog_tag"); 
            new Handler().postDelayed(new Runnable() { 
             @Override 
             public void run() { 
              Fragment f = mActivity.getSupportFragmentManager().findFragmentByTag("sample_dialog_tag"); 
              if(f!= null){ 
               DialogFragment df = (DialogFragment) f; 
               df.dismiss(); 
              } 
             } 
            }, 5000); 
           } 
      
           @Override 
           public void onAttach(Context context) { 
            super.onAttach(context); 
            if (context instanceof MainActivity) { 
             mActivity= (MainActivity) context; 
            } else { 
             throw new RuntimeException(context.toString() 
               + " MainActivityHeadlessFragment can only be used with MainActivity"); 
            } 
           } 
      
           @Override 
           public void onDetach() { 
            super.onDetach(); 
            mActivity= null; 
           } 
          } 
      
          private MainActivityHeadlessFragment mDataFragment; 
          private MainFragment mFragment; 
          @Override 
          protected void onCreate(Bundle savedInstanceState) { 
           super.onCreate(savedInstanceState); 
           setContentView(R.layout.activity_main); 
      
           FragmentManager fm = getSupportFragmentManager(); 
           mDataFragment = (MainActivityHeadlessFragment) fm.findFragmentByTag("data_fragment"); 
      
           // If the Fragment is non-null, then it is currently being 
           // retained across a configuration change. 
           if (mDataFragment == null) { 
            mDataFragment = new MainActivityHeadlessFragment(); 
            fm.beginTransaction().add(mDataFragment, "data_fragment").commit(); 
           } 
          } 
      
      
      
          public void ShowDialog(View v){ 
           mDataFragment.ShowDialog(); 
          } 
      } 
      

      は簡単にするために、私はnew Handler().postDelayed()でボレー要求を交換しましたが、考え方は同じでなければなりません。 。 。

    関連する問題