Как получить навыки программирования реального мира, когда Вы не работаете на [закрытую] компанию-разработчика программного обеспечения

Я собираюсь поделиться своим подходом к решению этой проблемы ротации. Это может не относиться к 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, поэтому не стесняйтесь комментировать.

13
задан Robert S. 28 February 2010 в 23:10
поделиться

8 ответов

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

Что касается

Есть ли способ найти открытый исходный код проекты (желательно на основе .Net)

зайдите на SourceForge и найдите что-то, интересное вам, и примите участие. Снова акцент на интересном. Не беспокойтесь о том, насколько это практично.

6
ответ дан 2 December 2019 в 00:03
поделиться

Я рискну и предложу вам написать код .

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

Когда использовать шаблоны проектирования
Как попасть в проекты с открытым исходным кодом C #

3
ответ дан 2 December 2019 в 00:03
поделиться

Навыки программирования в реальном мире: то, чем вы могли бы зарабатывать себе на жизнь в профессиональной среде.

Придумайте идею, она не обязательно должна быть САМОЙ ВЕЛИКОЙ идеей ... . тогда напишите это. Напишите это профессионально. Используйте контроль версий, даже для личного проекта. Иметь тикет-систему даже для личного проекта. Привыкайте делать вещи так, как это делает профессионал, даже для личного проекта. В противном случае вы просто усваиваете дурные привычки.

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

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

Затем, если ваш личный проект может быть интересен другим ... Выложи это там. Получите отзывы пользователей. Это будет жестокий и познавательный опыт, который нельзя купить ни за какую цену. Вы станете лучшим программистом для этого.

3
ответ дан 2 December 2019 в 00:03
поделиться

В свободное время я нахожу то, что меня интересует, строить и учиться в процессе. Например, вместо того, чтобы использовать стандартный форум или CMS, я бы создал свой собственный и учился на своих ошибках. Конечно, это не даст вам знаний об управлении исходным кодом и т. Д., Поскольку вы, скорее всего, будете единственным разработчиком, но обучение трюкам и лучший стиль кодирования, безусловно, того стоит. Возможно, вы тоже сможете принять участие в проекте с открытым исходным кодом! :)

1
ответ дан 2 December 2019 в 00:03
поделиться

Найдите опытных разработчиков, которые готовы периодически проводить с вами неформальные обзоры дизайна / кода по некоторым проектам, которые вы уже сделали (поскольку вы их хорошо знаете), чтобы они могли объяснить плюсы и минусы и возможные различные подходы к решению тех же проблем.

Чем больше у вас будет разных мнений о том, как опытные разработчики решат проблемы, с которыми вы знакомы, тем больше у вас будет вариантов решения следующей проблемы. Ожидайте, что подход каждого разработчика будет радикально разным, но все же поучительным. : -)

1
ответ дан 2 December 2019 в 00:03
поделиться

Вы можете многое сделать. На ум приходят следующие:

  • Участвуйте в проекте с открытым исходным кодом.
  • Много читаю StackOverflow
  • Задавайте много вопросов о StackOverflow
  • Читайте хорошие книги
0
ответ дан 2 December 2019 в 00:03
поделиться

Добавлю немного к ответу Уильяма: найдите интересный проект с открытым исходным кодом и станьте активным участником. Это не только даст вам возможность на практике написать код, но и возможность увидеть код других людей. Есть чему поучиться из кода, написанного другими программистами.

0
ответ дан 2 December 2019 в 00:03
поделиться

Существует очень популярный проект программного обеспечения с открытым исходным кодом C #, который всегда нуждается в дополнительной помощи.

Это называется Монопроект .

Я бы порекомендовал внести свой вклад в проект Mono, а не в другие, потому что они используют очень прозрачную и открытую модель разработки, и они имеют высокий статус, поэтому, на мой взгляд, «участие в Mono» имеет дополнительный престиж, чем многие случайные проекты открытого программного обеспечения C #. . Плюс Мигель де Икаса (глава Mono Project) классный и веселый парень.

2
ответ дан 2 December 2019 в 00:03
поделиться