Android-Threading: обратитесь к представлениям из потоков - PullRequest
0 голосов
/ 07 декабря 2010

Я пытался использовать темы для повышения производительности в своем приложении для Android.В методе onCreate я запустил два потока:

 @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.play);

    ...

    new Thread(new Runnable() {
        public void run() {
         makeList();
        }
    }).start();

    new Thread(new Runnable() {
        public void run() {
         setChronometer();
        }
    }).start();  
}  

. В этих методах я изменяю некоторые настройки моих просмотров.(без тяжелых событий)

Первый хронометр:

 private void setChronometer(){
 time.post(new Runnable() {
         public void run() {
       time.setFormat("Time: %s");
       time.setBase(SystemClock.elapsedRealtime());
       time.start();
         }
       });
 }

Второй a ListView:

private void makeList(){
  ...
        final ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(...);  

        list.post(new Runnable() {
         public void run() {
          list.setAdapter(listAdapter); 
          list.setOnItemClickListener(new OnItemClickListener() {
     public void onItemClick(AdapterView<?> parent,  View view, int position, long id) {
    ....

         }
       });
 }

Chronometer работает нормально, но операции вmakeList() не было сделано ... поэтому мой ListView не работает!

У меня была идея, что когда начинается действие, определение listView и Chronometer менее важно, поэтому я откладываю их в потоках,с целью, чтобы действие начиналось быстрее (более эффективно)

Прежде всего, было ли это хорошей идеей?

Во-вторых, почему мой ListView не работает?Когда я удаляю list.post(new Runnable() {, это работает, но я подумал, что это не очень хороший способ для Android.Потому что теперь представления напрямую изменены из потока.

В-третьих, когда я должен использовать потоки vs.View.post?

Любая помощь будет отличной, Спасибо!

Приветствия FireDragon

Ответы [ 2 ]

1 голос
/ 07 декабря 2010

Первое, что нужно помнить, это то, что элементы вашего пользовательского интерфейса - ваши View s и ListView s и т. Д. - должны быть доступны только вашему потоку пользовательского интерфейса (то есть вашему основному потоку).Если вы хотите изменить свой пользовательский интерфейс из фонового потока, вам нужно создать экземпляр Handler (в вашем потоке пользовательского интерфейса) и отправить ему сообщения и / или исполняемые файлы из фонового потока.

Звучит немного грязно?К счастью, Android включает в себя очень мощный класс AsyncTask, который ровно , что вам нужно, чтобы начать обучение.Вы помещаете свой фоновый поток в его doInBackground() член, и вы обновляете свой пользовательский интерфейс в onPostExecute(), и это намного проще, чем возиться с new Thread(), Handler s и т. Д.

0 голосов
/ 22 января 2011

Рувим прав насчет AsyncTask.Однако, если вы хотите понять, как работает Threading, я подробно описал различные подходы в блоге .AsyncTask - это путь, по которому можно идти.

...