Я собираюсь поделиться своим подходом к решению этой проблемы ротации. Это может не относиться к OP, поскольку он не использует AsyncTask
, но, возможно, другие найдут его полезным. Это довольно просто, но мне кажется, что эта работа мне подходит:
У меня есть вход в систему с вложенным классом AsyncTask
, который называется BackgroundLoginTask
.
В моем BackgroundLoginTask
я не делаю ничего необычного, кроме добавления нулевой проверки при вызове dismiss ProgressDialog
:
@Override
protected void onPostExecute(Boolean result)
{
if (pleaseWaitDialog != null)
pleaseWaitDialog.dismiss();
[...]
}
Это для обработки случая, когда Фоновое задание завершается, пока Activity
не виден, и поэтому диалоговое окно прогресса уже закрыто методом onPause()
.
Затем, в моем родительском классе Activity
, я создаю глобальные статические дескрипторы для моего класса AsyncTask
и моего ProgressDialog
(будучи вложенным, AsyncTask
может обращаться к этим переменным):
private static BackgroundLoginTask backgroundLoginTask;
private static ProgressDialog pleaseWaitDialog;
Это служит двум целям: во-первых, это позволяет my Activity
всегда получать доступ к объекту AsyncTask
даже из новой, пост-повернутой деятельности. Во-вторых, он позволяет моему BackgroundLoginTask
получать доступ и отклонять ProgressDialog
даже после поворота.
Затем я добавляю это к onPause()
, в результате чего диалоговое окно прогресса исчезает, когда наш Activity
покидает передний план (предотвращая это безобразное «принудительное закрытие» сбоя):
if (pleaseWaitDialog != null)
pleaseWaitDialog.dismiss();
Наконец, У меня есть следующее в моем методе onResume()
:
if ((backgroundLoginTask != null) && (backgroundLoginTask.getStatus() == Status.RUNNING))
{
if (pleaseWaitDialog != null)
pleaseWaitDialog.show();
}
Это позволяет Dialog
снова появляться после воссоздания Activity
.
Вот весь класс:
public class NSFkioskLoginActivity extends NSFkioskBaseActivity {
private static BackgroundLoginTask backgroundLoginTask;
private static ProgressDialog pleaseWaitDialog;
private Controller cont;
// This is the app entry point.
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (CredentialsAvailableAndValidated())
{
//Go to main menu and don't run rest of onCreate method.
gotoMainMenu();
return;
}
setContentView(R.layout.login);
populateStoredCredentials();
}
//Save current progress to options when app is leaving foreground
@Override
public void onPause()
{
super.onPause();
saveCredentialsToPreferences(false);
//Get rid of progress dialog in the event of a screen rotation. Prevents a crash.
if (pleaseWaitDialog != null)
pleaseWaitDialog.dismiss();
}
@Override
public void onResume()
{
super.onResume();
if ((backgroundLoginTask != null) && (backgroundLoginTask.getStatus() == Status.RUNNING))
{
if (pleaseWaitDialog != null)
pleaseWaitDialog.show();
}
}
/**
* Go to main menu, finishing this activity
*/
private void gotoMainMenu()
{
startActivity(new Intent(getApplicationContext(), NSFkioskMainMenuActivity.class));
finish();
}
/**
*
* @param setValidatedBooleanTrue If set true, method will set CREDS_HAVE_BEEN_VALIDATED to true in addition to saving username/password.
*/
private void saveCredentialsToPreferences(boolean setValidatedBooleanTrue)
{
SharedPreferences settings = getSharedPreferences(APP_PREFERENCES, MODE_PRIVATE);
SharedPreferences.Editor prefEditor = settings.edit();
EditText usernameText = (EditText) findViewById(R.id.editTextUsername);
EditText pswText = (EditText) findViewById(R.id.editTextPassword);
prefEditor.putString(USERNAME, usernameText.getText().toString());
prefEditor.putString(PASSWORD, pswText.getText().toString());
if (setValidatedBooleanTrue)
prefEditor.putBoolean(CREDS_HAVE_BEEN_VALIDATED, true);
prefEditor.commit();
}
/**
* Checks if user is already signed in
*/
private boolean CredentialsAvailableAndValidated() {
SharedPreferences settings = getSharedPreferences(APP_PREFERENCES,
MODE_PRIVATE);
if (settings.contains(USERNAME) && settings.contains(PASSWORD) && settings.getBoolean(CREDS_HAVE_BEEN_VALIDATED, false) == true)
return true;
else
return false;
}
//Populate stored credentials, if any available
private void populateStoredCredentials()
{
SharedPreferences settings = getSharedPreferences(APP_PREFERENCES,
MODE_PRIVATE);
settings.getString(USERNAME, "");
EditText usernameText = (EditText) findViewById(R.id.editTextUsername);
usernameText.setText(settings.getString(USERNAME, ""));
EditText pswText = (EditText) findViewById(R.id.editTextPassword);
pswText.setText(settings.getString(PASSWORD, ""));
}
/**
* Validate credentials in a seperate thread, displaying a progress circle in the meantime
* If successful, save credentials in preferences and proceed to main menu activity
* If not, display an error message
*/
public void loginButtonClick(View view)
{
if (phoneIsOnline())
{
EditText usernameText = (EditText) findViewById(R.id.editTextUsername);
EditText pswText = (EditText) findViewById(R.id.editTextPassword);
//Call background task worker with username and password params
backgroundLoginTask = new BackgroundLoginTask();
backgroundLoginTask.execute(usernameText.getText().toString(), pswText.getText().toString());
}
else
{
//Display toast informing of no internet access
String notOnlineMessage = getResources().getString(R.string.noNetworkAccessAvailable);
Toast toast = Toast.makeText(getApplicationContext(), notOnlineMessage, Toast.LENGTH_SHORT);
toast.show();
}
}
/**
*
* Takes two params: username and password
*
*/
public class BackgroundLoginTask extends AsyncTask<Object, String, Boolean>
{
private Exception e = null;
@Override
protected void onPreExecute()
{
cont = Controller.getInstance();
//Show progress dialog
String pleaseWait = getResources().getString(R.string.pleaseWait);
String commWithServer = getResources().getString(R.string.communicatingWithServer);
if (pleaseWaitDialog == null)
pleaseWaitDialog= ProgressDialog.show(NSFkioskLoginActivity.this, pleaseWait, commWithServer, true);
}
@Override
protected Boolean doInBackground(Object... params)
{
try {
//Returns true if credentials were valid. False if not. Exception if server could not be reached.
return cont.validateCredentials((String)params[0], (String)params[1]);
} catch (Exception e) {
this.e=e;
return false;
}
}
/**
* result is passed from doInBackground. Indicates whether credentials were validated.
*/
@Override
protected void onPostExecute(Boolean result)
{
//Hide progress dialog and handle exceptions
//Progress dialog may be null if rotation has been switched
if (pleaseWaitDialog != null)
{
pleaseWaitDialog.dismiss();
pleaseWaitDialog = null;
}
if (e != null)
{
//Show toast with exception text
String networkError = getResources().getString(R.string.serverErrorException);
Toast toast = Toast.makeText(getApplicationContext(), networkError, Toast.LENGTH_SHORT);
toast.show();
}
else
{
if (result == true)
{
saveCredentialsToPreferences(true);
gotoMainMenu();
}
else
{
String toastText = getResources().getString(R.string.invalidCredentialsEntered);
Toast toast = Toast.makeText(getApplicationContext(), toastText, Toast.LENGTH_SHORT);
toast.show();
}
}
}
}
}
Я ни в коем случае не опытный разработчик Android, поэтому не стесняйтесь комментировать.
Найдите хобби-проект , интересующий вас. Если вам это интересно, вы потратите гораздо больше времени на работу над кодом, чем если бы вы просто учились.
Что касается
Есть ли способ найти открытый исходный код проекты (желательно на основе .Net)
зайдите на SourceForge и найдите что-то, интересное вам, и примите участие. Снова акцент на интересном. Не беспокойтесь о том, насколько это практично.
Я рискну и предложу вам написать код .
Прочитать Код завершен . Посмотрите другие вопросы по этой теме здесь, на StackOverflow. Найдите проект с открытым исходным кодом и внесите в него свой вклад. Начните свой собственный проект, посвященный интересующим вас навыкам.
Когда использовать шаблоны проектирования
Как попасть в проекты с открытым исходным кодом C #
Навыки программирования в реальном мире: то, чем вы могли бы зарабатывать себе на жизнь в профессиональной среде.
Придумайте идею, она не обязательно должна быть САМОЙ ВЕЛИКОЙ идеей ... . тогда напишите это. Напишите это профессионально. Используйте контроль версий, даже для личного проекта. Иметь тикет-систему даже для личного проекта. Привыкайте делать вещи так, как это делает профессионал, даже для личного проекта. В противном случае вы просто усваиваете дурные привычки.
Я бы даже пошел дальше, чтобы попросить некоторых из тех друзей или родственников, у которых есть работа в отрасли, помочь вам с импровизированной проверкой кода. Купите им обед, держу пари, они это сделают.
Единственный способ чему-то научиться - это начать это делать. Ожидайте, что ваш первый код будет неудобным, и будет несколько раз переписан как часть вашего процесса роста.
Затем, если ваш личный проект может быть интересен другим ... Выложи это там. Получите отзывы пользователей. Это будет жестокий и познавательный опыт, который нельзя купить ни за какую цену. Вы станете лучшим программистом для этого.
В свободное время я нахожу то, что меня интересует, строить и учиться в процессе. Например, вместо того, чтобы использовать стандартный форум или CMS, я бы создал свой собственный и учился на своих ошибках. Конечно, это не даст вам знаний об управлении исходным кодом и т. Д., Поскольку вы, скорее всего, будете единственным разработчиком, но обучение трюкам и лучший стиль кодирования, безусловно, того стоит. Возможно, вы тоже сможете принять участие в проекте с открытым исходным кодом! :)
Найдите опытных разработчиков, которые готовы периодически проводить с вами неформальные обзоры дизайна / кода по некоторым проектам, которые вы уже сделали (поскольку вы их хорошо знаете), чтобы они могли объяснить плюсы и минусы и возможные различные подходы к решению тех же проблем.
Чем больше у вас будет разных мнений о том, как опытные разработчики решат проблемы, с которыми вы знакомы, тем больше у вас будет вариантов решения следующей проблемы. Ожидайте, что подход каждого разработчика будет радикально разным, но все же поучительным. : -)
Вы можете многое сделать. На ум приходят следующие:
Добавлю немного к ответу Уильяма: найдите интересный проект с открытым исходным кодом и станьте активным участником. Это не только даст вам возможность на практике написать код, но и возможность увидеть код других людей. Есть чему поучиться из кода, написанного другими программистами.
Существует очень популярный проект программного обеспечения с открытым исходным кодом C #, который всегда нуждается в дополнительной помощи.
Это называется Монопроект .
Я бы порекомендовал внести свой вклад в проект Mono, а не в другие, потому что они используют очень прозрачную и открытую модель разработки, и они имеют высокий статус, поэтому, на мой взгляд, «участие в Mono» имеет дополнительный престиж, чем многие случайные проекты открытого программного обеспечения C #. . Плюс Мигель де Икаса (глава Mono Project) классный и веселый парень.