Другие темы не позволят мне изменить макет деятельности !? Android - PullRequest
0 голосов
/ 14 марта 2012

РЕШЕНИЕ:

Возможно, это не самое лучшее или самое красивое решение, но оно работает. Начните новый поток, чтобы основной поток мог отображать 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);
}

Ответы [ 4 ]

2 голосов
/ 14 марта 2012

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

public void onCreate(Bundle savedInstanceState) {
  ...
progressDialog = ProgressDialog.show(this, "Loading", "Please wait...");
initiateActivity();
progressDialog.dismiss();

}

private void initiateActivity() {
    fillOrderTable();
    initiateGestureview();
    fillCustServiceForCustomer();
}

EDIT

Подумайте об этомРазница в том, что вам нужно выйти из onCreate, что происходит, если вы запускаете поток, который присоединяется к основному потоку.Поэтому приведенное выше решение не эквивалентно вашему решению по этой причине.

0 голосов
/ 15 марта 2012

РЕШЕНИЕ:

Возможно, это не самое лучшее или самое красивое решение, но оно работает. Начните новый поток, чтобы основной поток мог отображать 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();
}
0 голосов
/ 14 марта 2012

Можно инициировать изменение макета из другого потока, но вся работа должна выполняться в потоке пользовательского интерфейса. Для этого вы можете использовать методы Activity.runOnUiThread(), View.post(), View.postDelayed() или Handler.

.

В статье Threading Threading содержится больше подробностей относительно этой задачи.

0 голосов
/ 14 марта 2012

Вы не можете изменить пользовательский интерфейс из других потоков ... Чтобы изменить пользовательский интерфейс, вы должны использовать "runOnUiThread" или использовать какой-то обработчик для внесения изменений ... попробуйте это ... заставьте вашу деятельность реализовать Runnable

public class myclass extends Activity implements Runnable{
public void onCreate(Bundle savedInstanceState) {
 ......
progressDialog = ProgressDialog.show(this, "Loading", "Please wait...");
 Thread thread = new Thread(this);
            thread.start();
}
 public void run() {
            fillOrderTable();
            initiateGestureview();
            fillCustServiceForCustomer();
            handler.sendEmptyMessage(0);
    }
 private Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                    progressDialog.dismiss();


            }
    };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...