Экран Android AVD временно замерзает при вызове JSON для входа в систему

У меня есть экран входа в систему, который я использую для своего приложения. Он вызывает JSON для проверки правильности имени пользователя/пароля, если это так, он подписывает их и направляется в главное меню. Однако, поскольку для входа в систему требуется около 10-15 секунд, я добавил очень простой виджет "Прогресс", чтобы показать, что он фактически входит в систему (поэтому пользователь не путается). Тем не менее, всякий раз, когда я тестирую его на эмуляторе и регистрируюсь, экран входа в систему, кажется, замерзает, а затем через 10-15 секунд он записывается в порядке, но индикатор прогресса никогда не отображается, потому что экран AVD замерзает. У меня есть возможность установить видимость при вызове JSON. Если я вернусь к экрану входа в систему после того, как я войду в систему успешно, индикатор выполнения будет там и покажется очень хорошим.

Какие-нибудь советы по устранению этого? Спасибо, парни!

2 ответа

Я рекомендую использовать AsyncTask для выполнения длительных операций. А также уведомлять пользователей о том, что использует ProgressBar или AlertDialog или любой другой уведомитель, который соответствует вашим потребностям.

Вы должны думать о медленных сетях (2G, 3G) и возможных ограничениях скорости передачи данных, независимо от того, что может замедлить работу.

Ваш код должен обрабатывать длительные операции в другом, чем поток пользовательского интерфейса (который в основном является тем, что является Activity, потоком пользовательского интерфейса).

Чтобы понять использование и назначение AsyncTask рассмотрите следующие ссылки.

http://developer.android.com/reference/android/os/AsyncTask.html http://developer.android.com/resources/articles/painless-threading.html http://developer.android.com/guide/practices/design/responsiveness.html


Попробуйте использовать что-то вроде этого, если вы входите в метод onCreate, например.

public class YourActivity extends Activity {
 private static ProgressDialog pd = null;
 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.your_activity);
 YourActivity.this.pd = ProgressDialog.show(YourActivity.this,
 "Logging-in..", "Please wait...", true, false);
 new DownloadTask().execute(your parameters);
 }

 private class DownloadImageTask extends AsyncTask<param, param,="" param=""> {
 protected param doInBackground(param... params) {
 //logging-in 
 }
 protected void onPostExecute(your_result) {
 if (YourActivity.this.pd != null) {
 YourActivity.this.pd.dismiss();
 }
 }
 }
 } 
</param,>

licensed under cc by-sa 3.0 with attribution.