3

AsyncTask で画像を画像ビューにダウンロードしていますが、携帯電話を回転させたときに画像を保存し、画像ビューに再度ダウンロードしたくない...

public void onSaveInstanceState(Bundle toSave) {
    super.onSaveInstanceState(toSave);
    my_image.buildDrawingCache();
    Parcelable bm = my_image.getDrawingCache();
    toSave.putParcelable("savedImage", bm);

} 

私は onSaveInstanceStateで何か間違ったことをしているかどうかを理解しようとしています。また、この状態onRestoreInstanceStateを取得し、再度ダウンロードせずに画像を配置するにはどうすればよいですか...

4

3 に答える 3

7

onSaveInstanceState() 関数は、重いオブジェクトではなく、小さなオブジェクトを保存するために使用する必要があります。

電話のローテーションで重い画像を保存する場合は、次のいずれかの方法を使用してください。

  1. 大きなオブジェクトを保存する場合は、onRetainNonConfigurationInstance() 関数を使用します。
  2. または、その画像を静的にして、画像が一度だけ読み込まれるようにすることもできます。意味: ネットワークから画像をダウンロードする際に、静的変数が指すようにします。ユーザーが電話を回転させた場合、android はそのアクティビティを強制終了して再作成するため、その静的変数が null でない場合は if 条件チェックを入れてから、再度ダウンロードするだけです。ご存知のように、静的変数は 1 回だけ作成されるため、再度ダウンロードされることはありません。

ただし、できれば最初のオプションを選択してください。

参考:開発者アンドロイド公式チュートリアル

于 2013-12-07T07:50:50.380 に答える
0

まず第一にsuper.onSaveInstanceState(toSave)、 method の最後の場所にある必要がありますonSaveInstanceState(Bundle toSave)

onCreate(Bundle savedInstanceState)チェックでは、null でない場合は、必要savedInstanceStateなものを取得します。

@Override
protected void onCreate(Bundle savedInstanceState) {
...
    if(savedInstanceState != null){
        ...
        ...savedInstanceState.getParcerable(...);
        ...
    }
}
于 2013-04-19T17:28:39.387 に答える
0

ビットマップを保持するために静的変数を使用しないでください。

于 2015-10-26T15:51:36.653 に答える