Значение объекта Android изменилось при возобновлении - PullRequest
0 голосов
/ 05 декабря 2011

У меня очень странная ситуация ... (для меня)

Например, 2 объекта,
1 - логический элемент активности, который называется isInPage,
2 - это статический растровый объект с именем bmpPhoto.

Когда я занимаюсь своей деятельностью под названием FacebookShareActivity
isInPage будет истинным, пока я не выйду из этого действия,
bmpPhoto будет предоставлена ​​фотография.

После onCreare () и onResume () не выполняется никакого кода, пока пользователь не нажмет какой-нибудь графический интерфейс.
Я закрыл экран нажатием аппаратной кнопки питания и, возможно, подождал 5 или 10 минут.

ОК, теперь я снова нажимаю porwe, чтобы разбудить телефон, разблокировать экран,
и моя FacebookShareActivity возвращается на первый план.
И я нажимаю кнопку GUI, чтобы проверить значение переменной через Logcat, там написано:

isInPage = ложь; И я забыл значение bmpPhoto, но в моем графическом интерфейсе фотография просто исчезла,
больше не отображается ...



Как это случилось?
И это происходит не каждый раз, когда я это делаю ......


Что если я переопределю onSaveInstanceState (Bundle saveInstanceState) и
onRestoreInstanceState (Bundle saveInstanceState)?
Это поможет?
А что насчет растрового объекта?


Все еще не знаю, как это случилось ...
Я что-то пропустил?


Мне очень нужна твоя помощь, пожалуйста, всем ~

Следующее является частью моего кода, довольно долго ... «IsPageRunning» и «bmp» иногда менялись, когда возвращались с рабочего стола, но не каждый раз.

public class FacebookShareActivity extends Activity
{
  private Bundle b=null;
  private Bitmap bmp=null;
  private boolean isFacebookWorking=false;
  private boolean isPageRunning=true; //This value sometime changed when back from desktop, but not every time

  protected void onCreate(Bundle savedInstanceState)
  {
    Log.i(Constants.TAG, "ON Facebook Share create......");
    super.onCreate(savedInstanceState);
    setContentView(R.layout.facebook_share);
    setVolumeControlStream(AudioManager.STREAM_MUSIC);
  }

  private void initUI()
  {
    btnBack=(Button)findViewById(R.id.btnBack);
    btnBack.setOnClickListener(new ButtonClickHandler());

    formImage=(RelativeLayout)findViewById(R.id.form_image);
    formImage.setDrawingCacheEnabled(true);

    btnShare=(Button)findViewById(R.id.btnShare);
    btnShare.setOnClickListener(new ButtonClickHandler());

    txtIntroText=(TextView)findViewById(R.id.txtIntroText);
    txtIntroText.setOnClickListener(new ButtonClickHandler());
    txtIntroText.setText(getUploadInImageText());

    photo=(ImageView)findViewById(R.id.photo);
    bmp=Constants.PROFILE.getName().getPhoto();
    if(bmp!=null)
    {photo.setImageBitmap(bmp);} //bmp wouldn't be null, it filled by some other activity before
  }

  @Override
  protected void onResume()
  {
    super.onResume();
    Log.i(Constants.TAG, "Trying to set UI on resume...");
    b=getIntent().getExtras();
    // ...
    // ... Get some String value passed from prev activity

    facebook=new Facebook("123456789012345"); //Test
    asyncFacebook=new AsyncFacebookRunner(facebook);

    initUI();
    System.gc();
  }

  @Override
  public void onBackPressed()
  {
    Log.d(Constants.TAG, "Activity receive back key...");
    lockButtons(false);
    return;
  }

  private void lockButtons(boolean b)
  {
    if(isPageRunning)
    {
      btnBack.setClickable(!b);
      btnShare.setClickable(!b);
    }
  }

  private class DelayReleaseKey implements Runnable
  {
    public void run()
    {
      try{Thread.sleep(10000);}
      catch(InterruptedException ie){}
      handler.sendEmptyMessage(0);
    }
  }

  private class ButtonClickHandler implements OnClickListener
  {
    public void onClick(View v)
    {
      if(v==btnBack)
      {
        if(isFacebookWorking)
        {ShowAlertDialog(Constants.MESSAGE_FACEBOOK_WORK);}
        else
        {
          lockButtons(true);
          formImage=null;
          photo=null;
          b=null;
          facebook=null;
          isPageRunning=false;
          Intent intent=new Intent(FacebookShareActivity.this, PracticeListActivity.class);
          startActivity(intent);
          FacebookShareActivity.this.finish();
          overridePendingTransition(android.R.anim.slide_in_left,android.R.anim.slide_out_right);
        }
      }
      if(v==btnShare)
      {
        lockButtons(true);
        facebookLogin();
      }
    }
  }
}

Теперь я знаю, что должен переопределить onSaveInstanceState, onRestoreInstanceState. Они могут помочь мне сохранить переменную вроде String, int, boolean ... Как насчет битмапа? А что если моя переменная является статической?

Ответы [ 2 ]

0 голосов
/ 06 декабря 2011

Для примитивных значений вы должны использовать onSaveInstanceState. Для восстановления вы можете использовать onRestoreInstanceState или код в onCreate, например:

if(savedInstanceState != null) {
  // restore old state
} else {
  // a fresh start
}

Теперь для восстановления таких объектов, как Bitmap, если их создание не требует больших затрат и не замедляет работу пользовательского интерфейса, создайте их заново при восстановлении. Если вы не хотите этого, используйте onRetainNonConfigurationInstance и код будет выглядеть так:

@Override
public Object onRetainNonConfigurationInstance () {
  return bmp;
}

@Override
public void onCreate() {
  if
  bmp = (Bitmap)getLastNonConfigurationInstance();
}

ВНИМАНИЕ: Этот API устарел, вы можете использовать его на старых платформах. Я положил это здесь для иллюстрации. Новый способ сделать это более привлекателен.

Вот подробная ссылка:

getLastNonConfigurationInstance

onRetainNonConfigurationInstance

0 голосов
/ 06 декабря 2011

Теперь попробуйте еще раз.

public class FacebookShareActivity extends Activity
{
  private Bundle b=null;
  private static Bitmap bmp=null;
  private static boolean isFacebookWorking=false;
  private static boolean isPageRunning=true; //This value sometime changed when back from desktop, but not every time

  protected void onCreate(Bundle savedInstanceState)
  {
    Log.i(Constants.TAG, "ON Facebook Share create......");
    super.onCreate(savedInstanceState);
    setContentView(R.layout.facebook_share);
    setVolumeControlStream(AudioManager.STREAM_MUSIC);
  }

  private void initUI()
  {
    btnBack=(Button)findViewById(R.id.btnBack);
    btnBack.setOnClickListener(new ButtonClickHandler());

    formImage=(RelativeLayout)findViewById(R.id.form_image);
    formImage.setDrawingCacheEnabled(true);

    btnShare=(Button)findViewById(R.id.btnShare);
    btnShare.setOnClickListener(new ButtonClickHandler());

    txtIntroText=(TextView)findViewById(R.id.txtIntroText);
    txtIntroText.setOnClickListener(new ButtonClickHandler());
    txtIntroText.setText(getUploadInImageText());

    photo=(ImageView)findViewById(R.id.photo);
    bmp=Constants.PROFILE.getName().getPhoto();
    if(bmp!=null)
    {photo.setImageBitmap(bmp);} //bmp wouldn't be null, it filled by some other activity before
  }

  @Override
  protected void onResume()
  {
    super.onResume();
    isPageRunning = true;
    Log.i(Constants.TAG, "Trying to set UI on resume...");
    b=getIntent().getExtras();
    // ...
    // ... Get some String value passed from prev activity

    facebook=new Facebook("123456789012345"); //Test
    asyncFacebook=new AsyncFacebookRunner(facebook);

    initUI();
    System.gc();
  }

  @Override
  protected void onPause()
  {
        isPageRunning = false;
  }


  @Override
  public void onBackPressed()
  {
    Log.d(Constants.TAG, "Activity receive back key...");
    lockButtons(false);
    return;
  }

  private void lockButtons(boolean b)
  {
    if(isPageRunning)
    {
      btnBack.setClickable(!b);
      btnShare.setClickable(!b);
    }
  }

  private class DelayReleaseKey implements Runnable
  {
    public void run()
    {
      try{Thread.sleep(10000);}
      catch(InterruptedException ie){}
      handler.sendEmptyMessage(0);
    }
  }

  private class ButtonClickHandler implements OnClickListener
  {
    public void onClick(View v)
    {
      if(v==btnBack)
      {
        if(isFacebookWorking)
        {ShowAlertDialog(Constants.MESSAGE_FACEBOOK_WORK);}
        else
        {
          lockButtons(true);
          formImage=null;
          photo=null;
          b=null;
          facebook=null;
          isPageRunning=false;
          Intent intent=new Intent(FacebookShareActivity.this, PracticeListActivity.class);
          startActivity(intent);
          FacebookShareActivity.this.finish();
          overridePendingTransition(android.R.anim.slide_in_left,android.R.anim.slide_out_right);
        }
      }
      if(v==btnShare)
      {
        lockButtons(true);
        facebookLogin();
      }
    }
  }
}
...