onCreate потік продовжується після закінчення ()


76

Я хотів би закінчити дію всередині onCreateметоду. Коли я дзвоню finish(), onDestroy()не викликається відразу, код продовжує текти минулим finish(). onDestroy()викликається лише після onCreate()закриття фігурної дужки.

Відповідно до onCreate()опису на сторінці developer.android.com/reference.

Ви можете викликати finish () з цієї функції, і в цьому випадку onDestroy () буде негайно викликаний без виконання будь-якого решти циклу діяльності (onStart (), onResume (), onPause () тощо).

Причина, яку я запитую: я хотів би перевірити дані з набору, переданого onCreate(). Звичайно, у мене є контроль над тим, що передається onCreate, але я все ще думаю, що це слід перевірити в пункті доставки.

Мій код містить клас A, який запускає Activity B. Я вважаю, що останні два теги "за межами речення if" не слід викликати, оскільки finishметод у ifзаяві повинен був знищити активність. Це не має нічого спільного з реченням if, оскільки рядок тегу після другого finish()виклику все ще також читається.

Мій код:

Клас А

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // goToBButton: when pressed sends message to class B.    
    Button goToBButton = (Button)this.findViewById(R.id.go_to__b_btn);
    goToBButton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick (View v) {      
            Log.i(TAG,"A Class: goToBButton, onClick");
            Intent i = new Intent(A.this, B.class);
            startActivityForResult(i,REQ_TO_B);
        }       
    });                
} // end onCreate

Мій код ClassB

    public class B extends Activity{

private static final String TAG = "tag";

@Override
   public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.layoutb);

  // set as true, should always print Tag: one line before first finish"
  if (true)  {

    Log.i(TAG,"B Class: one line before 1st finish");
    finish();
  }

  // shouldn't get here after first finish
  Log.i(TAG,"B Class: outside of if clause, before second finish");
  finish();
  // shouldn't get here after second finish
  Log.i(TAG,"B Class: outside of if clause, after finish");                  
   } // end onCreate


@Override
public void onStart () {
    super.onStart();
    Log.i(TAG,"B Class: onStart");
}

@Override
public void onRestart() {
    super.onRestart();
    Log.i(TAG,"B Class: onRestart");
}

@Override
public void onResume () {
    super.onResume();
    Log.i(TAG,"B Class: onResume");
}

@Override
public void onPause () {
    super.onPause();
    Log.i(TAG,"B Class: onPause");
}

@Override
public void onStop () {
    super.onStop();
    Log.i(TAG,"B Class: onStop");
}

@Override
public void onDestroy () {
    super.onDestroy();
    Log.i(TAG,"B Class: onDestroy");
}

 } // end B Class

Ось результати моїх тегів:

11-26 15: 53: 40.456: INFO / тег (699): A Клас: goToBButton, onClick

11-26 15: 53: 40.636: INFO / тег (699): A Клас: onPause

11-26 15: 53: 40.865: ІНФО / тег (699): Клас B: один рядок перед 1-м фінішем

11-26 15: 53: 40.896: INFO / тег (699): Клас B: поза реченням if, перед другим фінішем

11-26 15: 53: 40.917: INFO / тег (699): Клас B: поза реченням if, після закінчення

11-26 15: 53: 41.035: INFO / тег (699): A Клас: onResume

11-26 15: 53: 41.165: INFO / тег (699): Клас B: onDestroy


"негайно" було дуже поганим вибором слів у документах ...
Кару

Відповіді:


122

Я здогадуюсь, що це тому, що finish () не викликає повернення методу onCreate. Ви можете спробувати просто додати

finish();
return;

Або використовуйте if else

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.layoutb);
  if(good data){
      //do stuff
  }else{
      finish();
  }
}

4
Перша пропозиція "просто додати повернення" спрацювала! Після того, як він повернеться, викликається клас А на резюме, а потім клас Б наДестрой.
flobacca

1
Просто додаючи return; показує помилки після цього для недосяжного коду. Щоб обійти це, використовуйте поверненняif
Онімуша

23

Здається, finish()це не працює, доки onCreate()повернення контролю в систему. Зверніться до цієї публікації: про finish () в android . Ви повинні розглянути цю проблему, якщо не хочете, щоб будь-який ваш код виконувався після виклику закінчення.

Сподіваюся, це допоможе.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.