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()返回的Object的复杂性中存在一些可能导致我的问题的东西?
或者最后我的Manifest.xml文件中有什么东西(比如Activity或Application属性)是问题吗?
如果需要任何进一步的信息,请告诉我,因为我将经常回来看这篇文章,直到我能够通过这条路上的这个小磕碰。
PS:ADB和我的设备都有这个问题
PSS:最重要的是,非常感谢这个社区的帮助和支持,非常感谢! :d
答案 0 :(得分:2)
您是否确认onRetainNonConfigurationInstance()
实际上已被调用?我看到你有一个祝酒词,但你实际上并没有说它正在显示。 (为什么要吐司而不仅仅是Log.i()
?)
正如文档所说,“这个函数纯粹被称为优化,你不能依赖它被调用。”你不能依靠这种情况实际发生。事实上它将发生的唯一时间是当你的活动在前台时发生配置改变时,在这种情况下,框架将在一个人中感受到调用onRetainNonConfigurationInstance()
并破坏当前实例并立即创建一个新实例,其中包含可用的保留对象。你应该做的几乎没有什么可以阻止你返回的对象出现在新实例中......虽然我想如果你在旧实例上调用finish()
或类似内容,那可能会这样做。
答案 1 :(得分:1)
对您的问题的解决方案不确定您的代码还有其他问题。你不应该使用onRetainNonConfigurationInstance来保存对活动上下文的引用,否则你将在以后泄漏活动。