Тема Android изменить EditText - PullRequest
3 голосов
/ 11 августа 2011

У меня проблема с изменением EditText в другой функции, запущенной потоком:

Thread thRead = new Thread( new Runnable(){
    public void run(){
       EditText _txtArea = (EditText) findViewById(R.id.txtArea);
       startReading(_txtArea);
    }
 });

моя функция выглядит следующим образом:

public void startReading(EditText _txtArea){
         _txtArea.setText("Changed");
}

Он всегда принудительно закрывается при попытке изменить текст редактирования. Кто-то знает почему?

Ответы [ 5 ]

5 голосов
/ 11 августа 2011

Представления пользовательского интерфейса не должны быть изменены из не-пользовательского потока.Единственным потоком, который может касаться представлений пользовательского интерфейса, является «основной» или «пользовательский интерфейс», который вызывает onCreate(), onStop() и другие подобные функции жизненного цикла компонента.

Поэтому, когда ваше приложение пытаетсяИзменив представления пользовательского интерфейса из потока, не являющегося пользовательским интерфейсом, Android выдает раннее исключение, чтобы предупредить вас, что это запрещено.Это связано с тем, что пользовательский интерфейс не является поточно-ориентированным, и такое раннее предупреждение на самом деле является отличной функцией.


ОБНОВЛЕНИЕ:

Вы можете использовать Activity.runOnUiThread()обновить пользовательский интерфейс.Или используйте AsyncTask.Но поскольку в вашем случае вам необходимо непрерывно читать данные с Bluetooth, AsyncTask не следует использовать.

Вот пример для runOnUiThread():

runOnUiThread(new Runnable() {            
    @Override
    public void run() {
        //this will run on UI thread, so its safe to modify UI views.
         _txtArea.setText("Changed");
    }
});
3 голосов
/ 11 августа 2011

Прежде всего, взгляните на ваш журнал, он обычно содержит трассировку стека, когда приложение закрывается.

Не следует запускать поток, как обычно, вместо этого используйте runOnUiThread:

Runnable thRead = new Runnable(){
   public void run() {
      EditText _txtArea = (EditText) findViewById(R.id.txtArea);
      startReading(_txtArea);
   }
};
runOnUiThread(thRead);

Объяснение: только поток пользовательского интерфейса может изменять состояние компонентов пользовательского интерфейса.

1 голос
/ 12 января 2013

Кроме runOnUiThread() (который работает), есть и другой способ, о котором я знаю:

Определите обработчик в вашем классе пользовательского интерфейса (Activity):

public class MainActivity extends Activity {

.....

    Handler uiThreadHandler = new Handler() {
        public void handleMessage(Message msg) {
            Object o = msg.obj;
            if (o==null) o = "";
            TextView textIn = (TextView)findViewById(R.id.textin);
            textIn.setText(o.toString());
        }
    };

}

и внутри какой-то нити вы можете назвать это:

Message msg = uiThreadHandler.obtainMessage();
msg.obj = "Text for EditView";
uiThreadHandler.sendMessage(msg);
1 голос
/ 11 августа 2011

Эта статья может вам помочь.

http://android -developers.blogspot.com / 2009/05 / painless-threading.html

Есть несколько вариантов:1. запустить его в потоке пользовательского интерфейса Activity.runOnUiThread (Runnable) 2. используйте AsyncTask

0 голосов
/ 11 августа 2011

По умолчанию основным потоком является поток пользовательского интерфейса. Весь код, который изменяет внешний вид приложения, должен быть запущен в этом потоке. Если вы хотите, чтобы в вашем приложении было несколько потоков, которые могут изменять пользовательский интерфейс, я бы предложил использовать класс AsyncTask.

public someMethod(){
    new ChangeTextTask().execute();
}

private class ChangeTextTask extends AsyncTask<Void, Void, Void> {
    @Override
    protected Void doInBackground(Void... params) {
        startReading(_txtArea);
        return null;
    }
}

Однако вам нужно предпринять шаги, чтобы предотвратить одновременный доступ нескольких объектов к объекту EditText. В противном случае вы получите ошибку CurrentModificationException.

http://developer.android.com/reference/android/os/AsyncTask.html

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