4

Google マップを使用してアイテムをオーバーレイする Android アプリケーションを構築しています。MySQL データベースから取得したアイテムの緯度と経度。これを行うには、非同期タスクで HTTP を使用して php スクリプトに接続します。マップ上にアイテムを表示するための私のコードは、非同期タスクの onPostExecute() メソッドにあります。

すべて正常に動作しますが、たとえば電話を回転させると、オーバーレイされたアイテムがすべて消えます。この問題を解決するにはどうすればよいですか?

メインスレッドでアイテムをオーバーレイする必要がありますか? もしそうなら、どうにかして async taks からメイン スレッドに情報を渡す必要があります。誰かがこれを行うための適切で正しい方法を知っていれば、本当に助けていただければ幸いです。

4

6 に答える 6

2

OnPostExecuteメインスレッドで呼び出されます! あなたの問題は、あなたの電話を回転させるときです

Android は実行中のアクティビティを再起動します (onDestroy() が呼び出され、次に onCreate() が呼び出されます)。再起動の動作は、新しいデバイス構成に一致する代替リソースでアプリケーションを自動的にリロードすることにより、アプリケーションが新しい構成に適応できるように設計されています。

. http://developer.android.com/guide/topics/resources/runtime-changes.html

于 2012-09-29T09:36:31.517 に答える
1

という名前のメソッドを作成してinitUi()呼び出し、onConfigurationChanged次のonCreateようなメソッドを作成します。

@Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        try {
            setContentView(...);
            initUi();               
        } catch (Exception e) {

        }
    }

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.act_document);
            initUi();  

        try {
            } catch (Exception e) {

        }
于 2012-09-29T09:56:21.893 に答える
1

アクティビティ クラスのonSaveInstanceState(Bundle outstate)と を使用します。onRestoreInstanceState(Bundle savedInstanceState)

于 2012-09-29T09:31:13.187 に答える
1

非同期タスクは、onpost メソッドがデフォルトでアタッチされているスレッドであり、メイン UI スレッドではなく、onConfigurationChanged メソッドを処理する必要がある非同期の問題ではなく、いくつかのコードを投稿することをお勧めします。

于 2012-09-29T09:32:35.183 に答える
1

前述のように、回転を変更すると、Android はアクティビティを再開します。したがって、これに対する解決策は、onSaveInstenceState でオーバーレイ アイテム データを保存する必要があり、onRestoreInstanceState で保存されたデータに基づいてオーバーレイ アイテムを再作成する必要があります。

于 2012-09-29T09:43:25.403 に答える
0

他の回答で述べたように、 onSaveInstanceState(Bundle outstate) と onRestoreInstanceState(Bundle savedInstanceState) を使用するか、デバイスの向きの変更を無効にすることで問題を解決できます。

1つずつ見てみましょう:

-向きの変更を無効にすると、ユーザーエクスペリエンスが低下する可能性があるため、好みません.

- onSaveInstanceState(Bundle outstate) と onRestoreInstanceState(Bundle savedInstanceState) を使用すると、2 つの主要なオプションがあります ...

オプション1:

表示されているアイテムに関する基本的な情報のみを保存し (つまり、マップの場合、マップの中心位置とズームを保存できます)、データベースからすべてのオーバーレイ情報を再度取得できます。これは非常に単純ですが、取得するオーバーレイ アイテムが数百ある場合は非常に遅くなる可能性があり、その結果、ユーザー エクスペリエンスがさらに低下します。

オプション 2:

parcelable を使用してオーバーレイ アイテムを拡張し、onSaveInstanceState(Bundle outstate) 中にすべてのオーバーレイ アイテムを保存し、データベースからリロードせずに復元することができます。私はこれを数千のアイテムで使用してきましたが、非常にうまく機能します。

ここで Parcelable 情報を見つけることができます: Google とここで例: Android – Parcelable クラスを使用してアクティビティ間で渡すデータのパーセル

幸運を

于 2012-09-29T10:58:59.770 に答える