ProgressDialog не появляется
У меня есть следующее в моей активности, которое я использую для загрузки пользовательских фильмов в их очереди LoveFilm, но ProgressDialog никогда не появляется.
public class MyListActivity extends Activity {
SharedPreferences prefs;
ProgressDialog m_progressDialog;
Thread listThread;
User user;
private Runnable threadProc_initializeQueue = new Runnable() {
public void run() {
user.fetchQueues();
Queue defaultQueue = user.getDefaultQueue();
defaultQueue.fetchTitles();
m_progressDialog.dismiss();
}
};
/* (non-Javadoc)
* @see android.app.Activity#onCreate(android.os.Bundle)
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
prefs = getSharedPreferences(getString(R.string.app_name), MODE_PRIVATE);
// Authenticate the user if needs be.
if(!prefs.getBoolean("isAuthenticated", false)) {
Intent i = new Intent(this, OAuthActivity.class);
startActivity(i);
finish();
} else {
// Get the users default list.
LoveDroid app = (LoveDroid) getApplication();
user = new User(app);
m_progressDialog = ProgressDialog.show(MyListActivity.this, "Please Wait", "Loading", true);
listThread = new Thread(null, threadProc_initializeQueue);
listThread.run();
}
}
Я видел других с этой проблемой, и они все в основном находят время, чтобы рекомендовать линию, которая похожа на мою
m_progressDialog = ProgressDialog.show(MyListActivity.this, "Please Wait", "Loading", true);
Остальная часть кода работает, фильмы пользователей загружаются через поток, но диалоговое окно никогда не показывается, это также занимает несколько секунд, не похоже, что диалоговое окно закрывается, прежде чем оно успело появиться.
2 ответа
Лучше, если вы используете AsyncTask (вместо потока - это, как правило, хорошая практика в деятельности Android).
Создайте класс AsyncTask, и в этом классе добавьте диалоговое окно прогресса в onPreExecute и отклоните его в onPostExecute. Вы можете найти пример здесь.
Кроме этого, в вашем коде есть несколько проблем:
- Вызов ProgressDialog.show(...) в onCreate(...) обычно проблематичен (поскольку вы не увидите его, пока не завершится onCreate, что обычно происходит после завершения фоновой активности).
- Все операции в вашем диалоге прогресса должны выполняться только в потоке пользовательского интерфейса, поэтому вы не можете использовать m_pd.dismiss() в каком-то случайном потоке (поэтому вы должны использовать AsyncTask).
Что делать, если вы позвоните с this
вместо MyListActivity.this
?
Возможно, хотя и маловероятно, поскольку это внутри onCreate(), он не вызывается из потока пользовательского интерфейса.
Попробуйте окружить вызов с помощью runOnUiThread():
Activity me = this;
runOnUiThread(new Runnable()
{
public void run()
{
m_progressDialog = ProgressDialog.show(me, "Please Wait", "Loading", true);
}
});