РЕШЕНИЕ:
Возможно, это не самое лучшее или самое красивое решение, но оно работает. Начните новый поток, чтобы основной поток мог отображать ProgressDialog, в то время как новый поток извлекает, назначает и прерывает основной поток с новым исполняемым файлом, чтобы инициировать представления. Чтобы ProgressDialog отображался во время выполнения всех действий в новом потоке, ProgressDialog должен, как уже упоминалось, запускаться в главном потоке и, конечно, удаляться в конце нового потока. ProgressDialog должен быть запущен как последняя вещь прямо перед началом нового потока, и все, чего вы хотите ждать, должно перейти в новый поток. И помните, что если вы хотите вносить изменения в пользовательский интерфейс во время ожидания и показа ProgressDialog, вы должны прервать основной поток с помощью нового запускаемого объекта, который вносит изменения в метод run()
, используя runOnUiThread
.
public void onCreate(Bundle savedInstanceState) {
...
((ScrollView) findViewById(R.id.contentContainer)).addView(getLayoutInflater().inflate(R.layout.myCustomContentLayout, null));
((TextView) findViewById(R.id.name)).setText(customer.getProperty("name").getValue().toString());
final ProgressDialog progressDialog = ProgressDialog.show(this, "Loading", "Please wait...");
new Thread(new Runnable() {
protected void run() {
... //get some data, fill some lists and assign some variables...
runOnUiThread(new Runnable() {
public void run() {
initiateActivity();
}
});
progressDialog.dismiss();
return true;
}
}).start();
}
ОРИГИНАЛЬНЫЙ ПОЧТА:
Привет всем и большое спасибо за чтение. :)
Неужели невозможно изменить макет вашей деятельности из потока, отличного от основного потока пользовательского интерфейса?
Я пытаюсь заполнить данные в таблице из другого потока, пока выполняется ProgressDialog. Вот так.
public void onCreate(Bundle savedInstanceState) {
...
((ScrollView) findViewById(R.id.contentContainer)).addView(getLayoutInflater().inflate(R.layout.myCustomContentLayout, null));
((TextView)findViewById(R.id.name)).setText(customer.getProperty("name").getValue().toString());
new Thread(new Runnable() {
public void run() {
... //get some data, fill some lists and assign some variables...
initiateActivity();
}
}).start();
progressDialog = ProgressDialog.show(this, "Loading", "Please wait...");
}
private void initiateActivity() {
fillOrderTable();
initiateGestureview();
fillCustServiceForCustomer();
progressDialog.dismiss();
}
Но как только я начинаю что-либо изменять или добавлять данные в таблицы, я получаю исключение .
И я действительно не хочу перемещать методы инициализации внутри потока, потому что они повторно используются из другой части моей деятельности.
Есть ли решение для этого?
Большое спасибо! :)
EDIT:
Пробовал это, но затем ProgressDialog не показывает ...
public void onCreate(Bundle savedInstanceState) {
...
((ScrollView) findViewById(R.id.contentContainer)).addView(getLayoutInflater().inflate(R.layout.myCustomContentLayout, null));
((TextView)findViewById(R.id.name)).setText(customer.getProperty("name").getValue().toString());
new Thread(new Runnable() {
public void run() {
runOnUiThread(new Runnable() {
public void run() {
... //get some data, fill some lists and assign some variables...
initiateActivity();
}
});
}
}).start();
progressDialog = ProgressDialog.show(this, "Loading", "Please wait...");
}
То же самое относится и к ...
public void onCreate(Bundle savedInstanceState) {
...
((ScrollView) findViewById(R.id.contentContainer)).addView(getLayoutInflater().inflate(R.layout.myCustomContentLayout, null));
((TextView)findViewById(R.id.name)).setText(customer.getProperty("name").getValue().toString());
new AsyncTask<Boolean, Boolean, Boolean>() {
protected void onPreExecute() {
progressDialog = ProgressDialog.show(this, "Loading", "Please wait...");
}
protected Boolean doInBackground(Boolean... unused) {
runOnUiThread(new Runnable() {
public void run() {
... //get some data, fill some lists and assign some variables...
initiateActivity();
}
});
return true;
}
protected void onPostExecute(Boolean unused) {
progressDialog.dismiss();
}
}).execute(true);
}