0

我遇到了一个非常奇怪的情况......(对我来说)

例如,2个对象,
1是一个名为isInPage的活动成员boolean,
2是一个名为bmpPhoto的静态位图对象。

当我进入我自己的名为 FacebookShareActivity 的 活动时,isInPage 将为
真,直到我退出此活动,
bmpPhoto 将获得一张图片。

在 onCreare() 和 onResume() 之后,没有任何代码在运行,直到用户单击某个 GUI。
我所做的是通过按下硬件电源按钮关闭屏幕,然后等待 5 或 10 分钟。

好的,现在我再次按 porwe 唤醒手机,解锁屏幕,
我的 FacebookShareActivity 回到前面。
然后我单击我的 GUI 按钮以通过 Logcat 检查变量值,它说:

isInPage=false; 而且我忘记了 bmpPhoto 的值,但在我的 GUI 上,照片刚刚消失,
不再显示......



这是怎么回事?
在我这样做之后,它并不是每次都发生......


如果我覆盖 onSaveInstanceState(Bundle savedInstanceState) 和
onRestoreInstanceState(Bundle savedInstanceState) 怎么办?
会有帮助吗?
那么位图对象呢?


仍然不知道这是怎么发生的......
我错过了什么吗?


我真的很需要你们的帮助,请大家帮忙~

以下是我的代码的一部分,很长......从桌面返回时,“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 等变量... Bitmap 呢?如果我的变量是静态的怎么办?

4

2 回答 2

0

对于原始值,您应该使用onSaveInstanceState. 为了恢复,您可以使用onRestoreInstanceState或者您可以使用onCreate如下代码:

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

现在,如果要恢复对象,例如Bitmap创建它们的成本不高且不会使您的 UI 变得迟缓,请在恢复时再次创建它们。如果您不想这样做,那么使用onRetainNonConfigurationInstance和代码将如下所示:

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

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

警告:此 api 已弃用,您可能会在旧平台上使用它。我把它放在这里是为了说明。做到这一点的新方法更具参与性。

这是详细的参考:

getLastNonConfigurationInstance

onRetainNonConfigurationInstance

于 2011-12-06T06:08:57.553 回答
0

现在再试一次。

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();
      }
    }
  }
}
于 2011-12-06T05:35:50.817 回答