проблема с просмотром текста

Я читаю некоторые данные, такие как скорость и текущее местоположение, используя однотонный класс.... Я читаю их, используя поток AsyncTask в цикле....:).... каждый раз, когда я читаю новый скорость и местоположение я устанавливаю в текстовом виде над картой.

Вот как выглядит часть моего кода:

while (true) {
    speed = ServerManager.getInstance().getLastSpeed();
    loc1 = ServerManager.getInstance().getLastLocation();
    speed = ServerManager.getInstance().getLastSpeed();
    speed_1.setText(Integer.toString(speed));
    location.setText(loc1);
}

куда:

  • скорость-поплавок и
  • loc1 — это строка.

Вот как выглядит мой xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"

    >

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

 android:orientation="horizontal"

 android:layout_width="fill_parent" 
  android:id="@+id/bar"
   android:background="#FFFFFF"
 android:layout_height="wrap_content"

>

<TextView 
    android:id="@+id/prod1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="3dip" 
    android:textSize="12px"
    android:text="Current Location"
                        />
   <TextView 
    android:id="@+id/location"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="3dip" 
     android:textColor="#013220"
    android:textSize="12px"

                        />      

<TextView
 android:id="@+id/prod2"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:gravity="center_horizontal"
 android:paddingLeft="90dip"
 android:textSize="12px"
 android:text="Speed"
            />

<TextView 
    android:id="@+id/speed"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="3dip" 
    android:textColor="#013220"
    android:textSize="12px"

                        />

</LinearLayout>

<com.google.android.maps.MapView 
        android:id="@+id/mapview1"
        android:layout_width="fill_parent"
        android:layout_below="@id/bar"
        android:layout_height="wrap_content"
        android:enabled="true"
        android:clickable="true"
 android:apiKey="0egkyrbiooKAfYyj43YB6wW1cmlG-TiIILXjpBg"
/>

</RelativeLayout>

И это ошибка, которую я получаю в своем логарифме:

   at android.view.ViewRoot.checkThread(ViewRoot.java:2683)

 at android.view.ViewRoot.requestLayout(ViewRoot.java:557)

 at android.view.View.requestLayout(View.java:7918)

 at android.view.View.requestLayout(View.java:7918)

 at android.view.View.requestLayout(View.java:7918)

at android.view.View.requestLayout(View.java:7918)

android.widget.RelativeLayout.requestLayout(RelativeLayout.java:255)

   at android.view.View.requestLayout(View.java:7918

 at android.view.View.requestLayout(View.java:7918)

 at android.widget.TextView.checkForRelayout(TextView.java:5380)

  at android.widget.TextView.setText(TextView.java:2684)

  at android.widget.TextView.setText(TextView.java:2552)

  at 
android.widget.TextView.setText(TextView.java:2527)

 at com.Server_1.Server4$InitTask.doInBackground(Server4.java:86)

 at com.Server_1.Server4$InitTask.doInBackground(Server4.java:1)

Строка, в которой я получаю ошибку:

speed_1.setText(Integer.toString(speed));

person embry    schedule 06.06.2011    source источник
comment
Что это за ошибка? Например, это может быть исключение NullPointerException или исключение IllegalArgumentException.   -  person keyboardsurfer    schedule 06.06.2011
comment
@Keyboardsurfer, скорее всего, это ConcurrentModificationException, так как это происходит в checkThread   -  person Felix    schedule 06.06.2011
comment
На самом деле, зачеркните это, это CalledFromWrongThreadException. Это единственное исключение, которое может выдать checkThread: google.com/codesearch/p?hl=ru#uX1GffpyOZk/core/java/android/   -  person Felix    schedule 06.06.2011
comment
Тогда я бы пошел с ответом @Thelper.   -  person keyboardsurfer    schedule 06.06.2011
comment
Именно то, что я сделал.... И другой ответ тоже хорош... но я уже использую publishProgress() для отправки данных GeoPOint пользовательского интерфейса.... И как мои новые данные являются плавающими и строковыми... это усложнило бы мою функцию publishProgress() :)... И с помощью души Thelper это работает :)   -  person embry    schedule 06.06.2011
comment
Хотя его проще реализовать с помощью runOnUiThread(), он менее эффективен. Передача задач между подобными потоками в фоновом режиме довольно сложна, поэтому лучше свести ее к минимуму. Я не говорю, что вы должны использовать мое решение, но вы должны знать об этом, если это станет проблемой.   -  person Felix    schedule 06.06.2011


Ответы (2)


Вы всегда должны публиковать обновления пользовательского интерфейса в UIThread.

runOnUiThread(new Runnable() {
        public void run() {
             speed_1.setText(Integer.toString(speed));
             location.setText(loc1);

        }
}
person THelper    schedule 06.06.2011

THelper прав, вы не можете выполнять какие-либо операции с пользовательским интерфейсом из другого потока, отличного от основного потока/потока пользовательского интерфейса. Вы можете либо использовать его решение (которое отлично работает), либо, поскольку вы уже используете AsyncTask, вы можете использовать предоставляемые им методы:

  • публикацияПрогресс
  • onProgressUpdate

По сути, изнутри вашего метода doInBackground вы вызываете publishProgress(), а класс AsyncTask обрабатывает все головные боли, связанные с потоком, и вызывает ваш onProgressUpdate как можно скорее в потоке пользовательского интерфейса, гарантируя, что вы можете изменить пользовательский интерфейс (например, вызвать setText) без каких-либо проблем. .

person Felix    schedule 06.06.2011