0

研究目的のためだけに、簡単なチャットアプリケーションを開発しようとしています。私の問題は、画面の向きが変わると、TCP/IP 接続が閉じられ、向きが変わった後に再作成されることです。

向きを変えると、Android がアクティビティを破棄して再作成することを知っています。

だから私の質問:ビューだけを変更して、他のすべてをそのままにしておくことは可能ですか?

ありがとう

4

5 に答える 5

3

TCP/IP 通信をサービスとして実装する必要があります。そうすれば、向きの変更やその他のアクティビティの再作成に依存しなくなります。

于 2012-07-13T20:25:29.237 に答える
2

ランタイムの変更の処理ドキュメントで構成の変更を自分で処理するというセクションを読みたいと思っています。つまり、 AndroidManifest の Activity 宣言に追加することで、それらを手動で処理することを伝えます。次に例を示します。android:configChanges="orientation|keyboardHidden"

<activity android:name=".MyActivity"
          android:configChanges="orientation|keyboardHidden"
          android:label="@string/app_name">

そして、アクティビティで次のonConfigurationChangedようにオーバーライドします。

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
    }
}
于 2012-07-13T20:18:20.947 に答える
1

アクティビティから接続を作成しないでください。代わりにアプリケーションを使用できます。

あなたのマニフェストで:

<application
        android:name=".MyApplication" ...>

一度作成されると、アクティビティが破棄された場合でも、アプリケーションの全期間にわたって存続します。

他の代替手段はサービスです。チャット アプリケーションの場合は、バックグラウンド ネットワーク作業を UI から完全に分離するため、これを使用します。

于 2012-07-13T20:29:14.620 に答える
1

!= null の場合は、接続を静的にして再作成しないか、シングルトン パターンを使用する別のクラスにラップすることもできます。

于 2012-07-13T20:16:30.720 に答える
1

ここでの本当の問題は、メインの UI スレッドで TCP/IP 接続を実行していることです。これは、タッチ イベントとレイアウトの生成をブロックするリスクがあるため、ひどい考えです。NetworkOnMainThreadException最近のほとんどの新しいデバイスでは、この動作も防ぐためにAがスローされます。

私がすることは、TCP/IP 接続を でラップしThread、. が破棄された場合でも がメモリに残るため、これにより構成の変更が保護されます。このアプローチの詳細については、こちらをご覧ください。ThreadFragmentsetRetainInstance(true)ThreadFragmentActivity

TCP/IP 接続が複数のActivityインスタンスにわたって存在する必要がある場合は、Service代わりに a を使用する必要があります。

于 2012-07-13T20:30:36.257 に答える