2010-11-21 12 views
1

アンドロイドアプリケーションでのローテーションの処理について多くのことを読んでいますが、まだまだ多くの質問があり、理解する必要があります。サーバリクエストとデバイスローテーションの処理

ここで私のアプリケーションで使用している問題または実装について説明します。

アクティビティが開かれた場合、取得要求がサーバーに送信されます。このリクエストはスレッド(新しいスレッド(...))で実行され、リクエストが完了するとアクティビティのuiがリフレッシュされます。

しかし、ユーザーが端末を回転させるとどうなりますか?

デフォルトでは、アクティビティは破棄され、要求は再び開始され、新しいスレッドが開始されますが、破棄されたアクティビティのスレッドはまだ実行されている可能性があります。

私はこれがかなり間違った方法だと思っています。

しかし、これを処理するにはどのような方法が最適ですか?

おそらくローテーションを禁止する最良の方法ですが、もし私がそれを望んでいないのなら、どうしたらいいでしょうか?

私はvideo form Google IOを見た:

は、それは私の質問の後半部分ですおそれ。 Dobjanschi氏は、サービスを利用し、取得したデータをコンテンツプロバイダに格納することを提案しました。だから、おそらく私の要求を実行するためのサービスを使用することができます。しかし、取得要求が完了するたびにデータを置き換える必要がありますか?私はそれらについて読んだことがあるが、本当にそれらをまだ実装していない

答えて

0

さてあなたは、インスタンスを保存し、次の方法で変更をconfigのときと同じを取得しようとすることができ、そのを行う方法を正確に知りません。私はそれがあなたにいくつかのスタートを与えることを望む。

@Override 
public Object onRetainNonConfigurationInstance() { 
return(myServerThread); 
} 

private void restoreServerFunctions() { 
if (getLastNonConfigurationInstance()!=null) { 
myServerThread=(Thread)getLastNonConfigurationInstance(); 
} 
} 
+0

スレッドは静的でなければならないのですか?アプリケーション内またはアクティビティ内の静的? ...静的ではないですか? – Tima

+0

@Mur Votema:これは、生のスレッドではなくAsyncTaskを使用していますが、このパターンについてさらに詳しく解説していますので、ここでは質問と回答です。http:// stackoverflow。com/questions/3821423/background-task-progress-dialog-orientation-change-there-any-100-working – CommonsWare

+0

あなたのアイデアに感謝します。別のトピックのMarkの答えは、ユーザが空白の画面を回転させた場合、ダウンロードスレッドを再起動するフル解決策 – Tima

0

アクティビティがローテーション自体を処理するように指定できます。これは、あなたのアンドロイドマニフェスト内のアクティビティのタグに

android:configChanges="keyboardHidden|orientation" 

を追加して行います。あなたは実際に回転を処理する必要はありませんが、これはアンドロイドにあなたの活動を破壊しないように指示します。基本アクティビティクラスは、ユーザーインターフェイスの回転をすべて処理し、スレッドは正しく実行されます。

小規模なサーバータスクを実行している場合は、AsyncTaskを使用して、スレッドを作成する代わりにバックグラウンドでサーバーへの呼び出しを実行します。これにより、スレッドからの結果をアクティビティに伝達し、UIを更新するのに必要なプログラミング作業が最小限に抑えられます。

-1

簡単な方法ですが、私はそれを試みたことはありません。現在のUIをリフレッシュする代わりに、スレッドが終了したら、ダウンロードしたばかりのコンテンツで新しいアクティビティを開始します。最初に空白のページ(またはページのフレームのみ)を使用してアクティビティを開始した後、空白のページを好きなだけ回転させると、ダウンロードしたスレッドが新しいアクティビティを生成し、空のページのアクティビティを読み込まれたコンテンツページに置き換えます現在の向きを使用します。

+0

についても説明しています。 – Janusz

+0

@Janusz:新しいダウンロードを開始しないスレッドダウンロードスレッドが既に開始している場合は、現在のアクティビティがローテーションのために閉じられたときに状態フラグをバンドルに保存して、別のダウンロードスレッドが既に存在していることがわかります。ダウンロードスレッドを開始する前にonCreate()を呼び出してください。 –

+0

@Janusz:このメソッドについてわからないことは、Androidアクティビティが回転のために破棄されたスレッドをAndroidが殺すかどうかである。 –

関連する問題