Intereting Posts

Метод OnCreate постоянно вызывает вызов


Обновление: Спасибо всем за попытку помочь мне решить эту ошибку. Я до сих пор не уверен в этом, я смог вернуться к предыдущей фиксации и продолжить развитие оттуда. Эта предыдущая фиксация показала ту же ошибку, однако после того, как я прокомментировал button.performClick() она исчезла. Как ни странно, это не работает с последним фиксатором.

Я до сих пор не понимаю эту ошибку и буду признателен за помощь, помогающую определить основную причину. Мой самый большой страх состоял в том, чтобы непреднамеренно повторно ввести его.


У меня самая сумасшедшая ошибка, которую я когда-либо видел.

Метод OnCreate вызывается снова и снова, замораживая мое приложение и давая мне небольшое мерцание. Единственное решение – это выйти на главный экран и принудительно выйти из приложения из меню настроек.

Вот что происходит в деталях:

  1. Запуск приложения (основная активность)
  2. Основная деятельность вызывает вторую активность
  3. Вторая активность вызывает onCreate, настраивается как обычно
  4. Вторая активность случайно решает выйти onCreate <- Я думаю, что это происходит
  5. Второе действие onCreate снова вызвано. Он никогда не возвращается к основной деятельности.

Я запустил отладчик, кажется, что второе действие успешно завершает последовательность onComplete / onResume, а затем решает выйти и перезапустить.

Кто-нибудь когда-либо слышал об этом поведении раньше?

Я не заметил никаких исключений. Кроме того, в ходе отладки я продолжал и проверял те места, которые вы видите как молчащие. (Это более старый код, прежде чем я утилит его заявлениями печати)

ОБНОВЛЕНИЕ: При попытке остановить процесс, я должен включить режим полета. Это означает, что он имеет какое-то отношение к этому кодовому блоку (вторая активность)

 else if (Network.haveNetworkConnection(Login.getContext()) && Login.checkClientId()) {...} 

Без Интернета он попадет в оператор else и не отобразит это поведение.

КОД:

OnResume () основной деятельности, где я называю Второе действие:

  @Override public void onResume() { super.onResume(); //Check If logged in, else go to login page Login.setContext(getApplicationContext()); //Reset Notification Number GCMIntentService.cancelNotifications(); /** GO TO LOGIN **/ if(!Login.isLoggedIn()) { //If user is not logged in, open login page System.out.println("RESUMING MAIN AND STARTING LOGIN INTENT"); Intent intent = new Intent(ActivityMain.this, ActivityLogin.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } else { Login.setupStuffOnce(); Event.pullEvents(); //Get New Events //Update ListView updateMainFeed(); } } 

Это вторая активность:

 public class ActivityLogin extends Activity { private String postData; //private Context c; //final Timer timer = new Timer(); //Facebook Stuff private Facebook facebook = new Facebook(Config.FBAPPID); private AsyncFacebookRunner mAsyncRunner = new AsyncFacebookRunner(facebook); //Layout Stuff EditText username, password; Button loginButton, signupButton; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Open Database Login.setContext(getApplicationContext()); Database.open(getApplicationContext()); } /* * @Override public void onPause() { s } */ @Override public void onResume() { super.onResume(); // shouldn't put here but oh well init(); //If coming from ActivitySignup if(Transfer.username != null) { username.setText(Transfer.username); password.setText(Transfer.password); Transfer.password = null; Transfer.username = null; loginButton.performClick(); } } public void init() { Login.getUserLoggedIn(); if (Login.isLoggedIn()) { //Do Any Additional Setup Login.setupStuffOnce(); // If user is logged in, open main Intent intent = new Intent(ActivityLogin.this, ActivityMain.class); //intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } else if (Network.haveNetworkConnection(Login.getContext()) && Login.checkClientId()) { // Else, Make User Login // Inflate Login and Present Website String clientid = Login.getClientId(); System.out.println("clientid:" + clientid); //System.exit(0); postData = "mobile=1&client_id="+Login.getClientId(); // Inflate the view setContentView(R.layout.activitylogin3); username = (EditText) findViewById(R.id.username); password = (EditText) findViewById(R.id.password); //Inflate the Button loginButton = (Button) findViewById(R.id.loginButton); signupButton = (Button) findViewById(R.id.signupButton); signupButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(ActivityLogin.this, ActivitySignup.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(intent); } }); loginButton.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { int res = Login.sendLogin(username.getText().toString(), password.getText().toString()); if(res == 202) { //Login Successful //Check if facebooked. if(Login.isFacebooked()) { //Just go to main Intent intent = new Intent(ActivityLogin.this, ActivityMain.class); //Are these flags necessary? //intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } else { //Go to facebook login page //Intent intent = new Intent(ActivityLogin.this, ActivityFBLogin.class); //startActivity(intent); //Login via Facebook doFacebook(); } } else { System.out.println("Login Failed: "+res); if(res == 405) { Toast.makeText(getApplicationContext(), "Incorrect Username/Password", Toast.LENGTH_SHORT).show(); password.setText(""); } else Toast.makeText(getApplicationContext(), "Network Error", Toast.LENGTH_SHORT).show(); //Not entirely true in all cases i think } /*Login.getUserLoggedIn(); if(Login.isLoggedIn()) { Intent intent = new Intent(ActivityLogin.this, ActivityMain.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } else { Toast.makeText(getApplicationContext(), "Please Login Above", Toast.LENGTH_SHORT).show(); }*/ } }); } else { // Not Logged In and No Internet Access setContentView(R.layout.activitylogintext); EditText text = (EditText) findViewById(R.id.text); text.setText("No Internet Connection Detected\n requires internet to login"); Button button = (Button) findViewById(R.id.refreshButton); button.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { //Login.getUserLoggedIn(); if(Network.haveNetworkConnection(Login.getContext())) { Intent intent = new Intent(ActivityLogin.this, ActivityLogin.class); //intent.setFlags(); startActivity(intent); } else { Toast.makeText(getApplicationContext(), "No Internet Access Detected", Toast.LENGTH_SHORT).show(); } } }); } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); facebook.authorizeCallback(requestCode, resultCode, data); } public void doFacebook() { facebook.authorize(this, Config.facebookPermissions, new DialogListener() { @Override public void onComplete(Bundle values) { /*SharedPreferences.Editor editor = state.edit(); editor.putString("access_token", facebook.getAccessToken()); editor.putLong("access_expires", facebook.getAccessExpires()); editor.commit(); */ //Input into database Login.saveAccessToken(facebook.getAccessToken()); Login.setFB(facebook.getAccessToken()); //Login.sendAccessToken(facebook.getAccessToken()); //Intent into Main Activity Intent intent = new Intent(ActivityLogin.this, ActivityMain.class); //intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } @Override public void onFacebookError(FacebookError error) { Toast.makeText(getApplicationContext(), "Error: "+error.getErrorType(), Toast.LENGTH_SHORT).show(); } @Override public void onError(DialogError e) { Toast.makeText(getApplicationContext(), "Error: "+e.getMessage(), Toast.LENGTH_SHORT).show(); } @Override public void onCancel() {} }); } public boolean checkForUserID(Context c) { try{ String res = Network.getUrl("www.website.com/mobile.php?got_user=1&client_id="+Login.getClientId()); JSONObject json = JSON.constructObject(res); if(JSON.handleCode(json)) { if(json.getString("type").equals("userid")) { Login.setLogin(json.getString("data")); return true; } } } catch(Exception e) { //Silent Fail } return false; } } 

Solutions Collecting From Web of "Метод OnCreate постоянно вызывает вызов"

Я считаю, что проблема будет решена, если вы закончите свою MainActivity после вызова SecondActivity . Вероятно, проблема заключается в том, что событие onResume немедленно запускается при возобновлении MainActivity . Это потому, что MainActivity вероятно, был уничтожен и воссоздан, когда он был в фоновом режиме. Другим решением было бы сохранить состояние вашей активности с помощью onSaveInstanceState . См. Здесь дополнительную информацию.

Проверьте этот код в своей деятельности:

  Button button = (Button) findViewById(R.id.refreshButton); button.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { if(Network.haveNetworkConnection(Login.getContext())) { Intent intent = new Intent(ActivityLogin.this, ActivityLogin.class); //intent.setFlags(); startActivity(intent); } else { Toast.makeText(getApplicationContext(), "No Internet Access Detected", Toast.LENGTH_SHORT).show(); } } }); 

Здесь вы вызываете ActivityLogin самостоятельно. Вот почему onCreate() вызывается снова и снова.

Однажды у меня была аналогичная проблема. Проблема возникла из-за того, что я внесла изменения в конфигурацию, не объявив их в android:configChanges <activity> (и, следовательно, он воссоздает себя все время).

Например, если вы вручную измените языковой стандарт, вам нужно добавить locale в android:configChanges !

Мне кажется, что существует хороший шанс для бесконечного циклирования здесь, если Login не распределяется должным образом между действиями, в результате чего Login.isLoggedIn() возвращает true в ActivityLogin но false в ActivityMain .

Несколько критических факторов, где находится ваш объект Login , является ли он статичным, как он ссылается на действия? Вполне возможно, что ActivityMain будет уничтожен, а ActivityLogin активен; SharedPreferences данных входа в SharedPreferences или базы данных или сохранение в остальном важности. Как isLoggedIn() разрешает (определяет его return значение?)

Предложение 1: Рассмотрите возможность использования шаблона Singleton (если вы еще этого не сделали.) Предложение 2: Несмотря на то, что вы не поощряетесь, вы можете сохранить Login на уровне Application . Предложение 3: вы можете попробовать использовать Intent.FLAG_ACTIVITY_SINGLE_TOP чтобы уменьшить вероятность создания новой ActivityMain, которая может не иметь доступа к Login , снова в зависимости от того, как вы ее сохранили.

ActivityMain

 onResume() { if(!Login.isLoggedIn()) { /* Not logged in, launch ActivityLogin! */ Intent intent = new Intent(ActivityMain.this, ActivityLogin.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); 

ActivityLogin

 onResume() { /* ... */ init(); } init() { Login.getUserLoggedIn(); if (Login.isLoggedIn()) { /* Internet - launch ActivityMain! */ Intent intent = new Intent(ActivityLogin.this, ActivityMain.class); intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); // <--- suggested addition startActivity(intent); else if (Network.haveNetworkConnection(Login.getContext()) && Login.checkClientId()) { /* No internet, the user was unable to login. */ } 

Я думаю, что ваша главная проблема заключается в том, что вы работаете с функцией onResume, поскольку она вызывается каждый раз, когда она возвращается в поле зрения (например: вы начинаете вторую активность, завершаете ее, основная активность onResume вызывается снова. Если вы закончите свою вторую активность (или она спокойно падает По какой-либо причине), вы вернетесь к своей основной функции и вызове в поле «Сообщение» (которое начнет цикл снова).

Теперь я не знаю, закончили ли вы активность 2, но я бы это проверить.

EDIT: Кроме того, я бы поставил некоторые логарифмы здесь

 if (Login.isLoggedIn()) { //Do Any Additional Setup Login.setupStuffOnce(); // If user is logged in, open main Intent intent = new Intent(ActivityLogin.this, ActivityMain.class); //intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); Log.i("Some Tag", "Starting Main Activity From Activity 2"); startActivity(intent); } 

Вышеупомянутое добавление log.i позволит вам узнать, происходит ли ошибка, и вы можете перейти оттуда.

У меня была схожая проблема, когда деятельность будет воссоздаваться все время. Повторная установка приложения не помогла, но перезагрузка телефона выполнила эту работу.