Проблема с getLastNonConfigurationInstance () - кажется, только когда-либо возвращать ноль - PullRequest
1 голос
/ 29 сентября 2010
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 (), просто чтобы посмотреть, в какой степени я смог заставить его работать для меня, но он все еще, казалось, возвращал ноль. Я не пробовал вызывать его из 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 (), кроется какая-то сложность, которая может способствовать моим проблемам?

Или, наконец, есть что-то (например, свойство Activity или Application) в моем файле Manifest.xml, что является проблемой?

Если потребуется какая-либо дополнительная информация, пожалуйста, дайте мне знать, так как я буду часто проверять этот пост до тех пор, пока не смогу преодолеть эту маленькую неровность на дороге.
PS: у меня есть проблема как с ADB, так и с моим устройством.
PSS: самое главное, большое СПАСИБО этому сообществу за помощь и поддержку, поскольку это очень ценится! : D

Ответы [ 2 ]

2 голосов
/ 29 сентября 2010

Вы подтвердили, что onRetainNonConfigurationInstance() на самом деле вызывается? Я вижу, что у вас есть тост, но на самом деле вы не говорите, что его показывают. (А почему тост вместо просто Log.i()?)

Как сказано в документации, «эта функция вызывается исключительно как оптимизация, и вы не должны полагаться на то, что она вызывается». Вы не можете полагаться на это на самом деле происходит. только раз, когда это произойдет, на самом деле это когда изменение конфигурации происходит, когда ваша деятельность находится на переднем плане, и в этом случае фреймворк одним махом вызовет махом onRetainNonConfigurationInstance(), уничтожит текущий экземпляр и немедленно создаст новый экземпляр с сохраненным объектом, доступным для него. Не должно быть практически ничего, что могло бы помешать появлению возвращаемого вами объекта в новом экземпляре ... хотя я полагаю, если вы вызовете finish() или что-то подобное на старом, это может сделать это.

1 голос
/ 29 сентября 2010

Не уверен, что в решении вашей проблемы есть другая проблема с вашим кодом. Вы не должны использовать onRetainNonConfigurationInstance для чего-либо подобного, содержащего ссылку на контекст действия, иначе вы потеряете действие позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...