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()确实被调用了?我看到你在里面显示了一个 toast,但你实际上并没有说它正在显示。(为什么要祝酒而不仅仅是一个Log.i()?)

正如文档所说,“这个函数纯粹是作为一种优化来调用的,你不能依赖它被调用。” 你不能依赖这实际发生的事情。实际上,唯一会发生的情况是当您的活动在前台时发生配置更改,在这种情况下,框架会突然调用onRetainNonConfigurationInstance()并销毁当前实例,并立即创建一个新实例,其中保留的对象可用于它。您应该几乎无法做任何事情来阻止您返回的对象出现在新实例中……尽管我猜如果您finish()在旧实例上调用或类似的操作,那可能会做到。

于 2010-09-29T03:48:21.267 回答
1

不确定您的问题的解决方案,您的代码还有另一个问题。您不应该将 onRetainNonConfigurationInstance 用于包含对活动上下文的引用的任何内容,否则您稍后会泄漏活动。

于 2010-09-28T21:34:38.207 回答