0

私は非常に奇妙な状況に陥りました...(私にとって)

たとえば、2 つのオブジェクト、
1 は isInPage と呼ばれるアクティビティ メンバー ブール値、
2 は bmpPhoto と呼ばれる静的ビットマップ オブジェクトです。

FacebookShareActivity isInPage という自分のアクティビティに入る
と、このアクティビティを終了するまで true になり、
bmpPhoto に画像が与えられます。

onCreare() と onResume() の後、ユーザーが GUI をクリックするまで、実行中のコードはありません。
私がしたことは、ハードウェアの電源ボタンを押して画面を閉じ、おそらく5分または10分待ちました.

OK、もう一度 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 はどうですか? 私の変数が static の場合はどうなりますか?

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 に答える