1
public class XPBN extends Activity{
private Map _map;

@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);

    final Map data = (Map)getLastNonConfigurationInstance();
    if (data == null) {
        Toast.makeText(this, "New Map", Toast.LENGTH_SHORT).show();
        _map = new Map(this);
    } else {
        Toast.makeText(this, "Old Map", Toast.LENGTH_SHORT).show();
        _map = (Map)data;
    }

    setContentView(_map);
}

@Override
public Object onRetainNonConfigurationInstance() {
    Toast.makeText(this, "Saving Configuration...", Toast.LENGTH_LONG).show();
    return _map;
}
}

私がこのフォーラム スレッドに付けたタイトルは、私が経験している問題をかなり詳しく説明していると思います。また、コードを編集して、文字列オブジェクトを保存し、getLastNonConfigurationInstance() を介して文字列オブジェクトを復元しようとしましたが、どの程度機能するかを確認しましたが、それでも null を返すように見えました。onStart() または onRestart() または onResume() から呼び出してみたことはありませんが、読んだことから、通常はとにかく onCreate(Bundle) からのみ呼び出されます。これは私を本当に混乱させました... :/

Map クラス オブジェクトについて少し知っておくと役立つかもしれないと考えたので、そのコード (の一部) を次に示します。

public class Map extends SurfaceView implements SurfaceHolder.Callback{
private MapThread _mapThread;
private int _terrain[][];
private ArrayList<Player> playerList;
private Bitmap _blueback;
private Bitmap _bluefront;
private Bitmap _blueleft;
private Bitmap _blueright;
private Bitmap _greenback;
private Bitmap _greenfront;
private Bitmap _greenleft;
private Bitmap _greenright;
private Bitmap _redfront;
private Bitmap _redback;
private Bitmap _redleft;
private Bitmap _redright;
private Bitmap _robot1;
private Bitmap _forest;
private Bitmap _grass;
private Bitmap _mountain;
private Bitmap _tree;
@SuppressWarnings("unused")
private boolean _mapLoaded = false;
private int _viewX = 0;
private int _viewY = 0;

Map(Context context){
    super(context);
    getHolder().addCallback(this);
    _mapThread = new MapThread(this);
    setFocusable(true);

    _terrain = new int[100][100];
    playerList = new ArrayList<Player>();
    addPlayer(0, 0, 0);

    _blueback = BitmapFactory.decodeResource(context.getResources(), R.drawable.blueback);
    _bluefront = BitmapFactory.decodeResource(context.getResources(), R.drawable.bluefront);
    _blueleft = BitmapFactory.decodeResource(context.getResources(), R.drawable.blueleft);
    _blueright = BitmapFactory.decodeResource(context.getResources(), R.drawable.blueright);
    _greenback = BitmapFactory.decodeResource(context.getResources(), R.drawable.greenback);
    _greenfront = BitmapFactory.decodeResource(context.getResources(), R.drawable.greenfront);
    _greenleft = BitmapFactory.decodeResource(context.getResources(), R.drawable.greenleft);
    _greenright = BitmapFactory.decodeResource(context.getResources(), R.drawable.greenright);
    _redback = BitmapFactory.decodeResource(context.getResources(), R.drawable.redback);
    _redfront = BitmapFactory.decodeResource(context.getResources(), R.drawable.redfront);
    _redleft = BitmapFactory.decodeResource(context.getResources(), R.drawable.redleft);
    _redright = BitmapFactory.decodeResource(context.getResources(), R.drawable.redright);
    _robot1 = BitmapFactory.decodeResource(context.getResources(), R.drawable.robot1);
    _forest = BitmapFactory.decodeResource(context.getResources(), R.drawable.forest);
    _grass = BitmapFactory.decodeResource(context.getResources(), R.drawable.grass);
    _mountain = BitmapFactory.decodeResource(context.getResources(), R.drawable.mountain);
    _tree = BitmapFactory.decodeResource(context.getResources(), R.drawable.tree);

    TouchScreenHandler handler = new TouchScreenHandler(); // This includes 2 other nested-class threads
    this.setOnTouchListener(handler);
}

おそらく、onRetainNonConfigurationInstance() によって返されるオブジェクトの複雑さに何か問題があり、それが問題の原因になっている可能性があります。

または最後に、Manifest.xml ファイルに問題のあるもの (Activity または Application プロパティなど) がありますか?

さらに情報が必要な場合はお知らせください。この小さな問題を乗り越えられるまで、この投稿を頻繁に確認します。
PS: ADB とデバイスの両方にこの問題があります。
PSS: 最も重要なことは、このコミュニティのヘルプとサポートに大いに感謝することです。:D

4

2 に答える 2

2

onRetainNonConfigurationInstance()実際に呼び出されていることを確認しましたか?トーストが表示されているようですが、実際に表示されているとは言いません。(そして、なぜ単なるトーストではなくトーストなのLog.i()ですか?)

ドキュメントにあるように、「この関数は純粋に最適化のために呼び出されており、呼び出されていることに依存してはなりません。」これが実際に起こっていることに頼ることはできません。実際に発生するのは、アクティビティがフォアグラウンドにあるときに構成の変更が発生した場合のみです。この場合、フレームワークは 1 回のフィール スウープ コールonRetainNonConfigurationInstance()で現在のインスタンスを破棄し、保持されたオブジェクトを使用して新しいインスタンスをすぐに作成します。それ。返されたオブジェクトが新しいインスタンスに表示されないようにするためにできることはほとんどないはずです...ただしfinish()、古いインスタンスで呼び出しなどを行うと、それが実行される可能性があります。

于 2010-09-29T03:48:21.267 に答える
1

問題の解決策がわからない場合は、コードに別の問題があります。アクティビティ コンテキストへの参照を保持するようなものには onRetainNonConfigurationInstance を使用しないでください。そうしないと、後でアクティビティがリークします。

于 2010-09-28T21:34:38.207 に答える