Problema con getLastNonConfigurationInstance () - parece volver solamente siempre nula

StackOverflow https://stackoverflow.com/questions/3817159

  •  26-09-2019
  •  | 
  •  

Pregunta

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;
}
}

Voy a suponer que el título le dio a este foro hilo afirma el problema que estoy experimentando bastante a fondo. También he editado el código para intentar salvar un objeto de cadena y luego recuperar el objeto de cadena a través de la getLastNonConfigurationInstance (), sólo para ver en qué medida pude conseguir que funcione para mí, pero todavía parecía nula rentabilidad. No he intentado llamar desde onStart () o onRestart () o onResume (), pero por lo que he leído, es por lo general sólo se llama desde onCreate (Bundle) de todos modos. Esto me tiene muy confundido ...: /

pensé que puede ser de alguna ayuda a conocer un poco acerca de mi clase de objeto del mapa, así que aquí está (algunos de) el código de él:

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);
}

Tal vez hay algo que se encuentra en la complejidad del objeto devuelto por onRetainNonConfigurationInstance () que podrían estar contribuyendo a mis problemas?

O, por último, ¿hay algo (como una propiedad de actividad o aplicación) en mi archivo Manifest.xml que es el problema?

Si se requiere cualquier información adicional, por favor hágamelo saber, ya que estaré revisando de nuevo en este post con frecuencia hasta que pueda conseguir más allá de este pequeño bache en el camino.
PS: Tengo este problema tanto con el BAD y mi dispositivo
. PSS: lo más importante, un gran agradecimiento a esta comunidad por la ayuda y apoyo, ya que es muy apreciada! : D

¿Fue útil?

Solución

¿Ha confirmado que onRetainNonConfigurationInstance() es en realidad ser llamado? Veo que tiene una tostada que se muestra en ella, pero que en realidad no decir que se está mostrando. (¿Y por qué una tostada en lugar de sólo una Log.i()?)

Como dice la documentación "esta función se denomina simplemente como una optimización, y usted no debe confiar en que se está llamando." No se puede confiar en esta sucediendo realmente. El solamente de tiempo que va a pasar, de hecho, es cuando un cambio de configuración sucede mientras que su actividad está en primer plano, en cuyo caso la voluntad marco en el que uno se sienta llamada sola vez onRetainNonConfigurationInstance() y destruir la instancia actual e inmediatamente crear una nueva instancia con el objeto retenido a su disposición. No debe haber nada más o menos que puede hacer que impida el objeto regrese de aparecer en la nueva instancia ... aunque supongo que si se llama finish() o como en el anterior, que podrían hacerlo.

Otros consejos

No está seguro acerca de la solución a su problema, hay otro problema con su código. No se debe utilizar para onRetainNonConfigurationInstance nada de eso contiene una referencia al contexto de la actividad, de lo contrario se escape la actividad posterior.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top