Intereting Posts
Как реализовать тип завитки страницы, используемый в Google Play Книгах? Android: Не удалось установить .apk на устройстве «устройство»: тайм-аут PhoneGap – приложение phonegap phonegap дает ошибку компиляции в Linux Масштабирование и выравнивание относительной структуры Android Андроидная студия java завершена с ненулевым значением выхода 2 SQLiteQueryBuilder.query () и SQLiteDatabase.query () Скачать изображения с помощью AsyncTask Android view – onAttachedToWindow и onDetachedFromWindow – когда они вызываются в жизненном цикле активности? SharedPreferences не удаляется при удалении пользователя Как получить значение RGB из шестнадцатеричного кода цвета в java Данные о намерениях камеры null в onActivityResult (int requestCode, int resultCode, Intent data) в Samsung S3 Возможно ли установить приложение через adb, но все равно получать обновления в Google Market? Физический размер шрифта в точках на Android Как проверить, разрешено ли моему приложению показывать уведомление Использование MessagePack с Android

Ошибка обновления TextView из метода запуска TimerTask

Я пытаюсь проверить возможности интерфейса и таймера. Поэтому я попробовал следующее упражнение:

=== TestTimerActivity.java ===

package com.tvt.TestTimer; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; import java.util.Timer; import java.util.TimerTask; public class TestTimerActivity extends Activity { TextView _tv; Timer _t; int _count = 0; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // // _tv = (TextView) getWindow().getDecorView().findViewById( R.id.TextViewTime ); _tv = (TextView) findViewById( R.id.TextViewTime ); UpdateTime(); // Completes OK _t = new Timer(); _t.scheduleAtFixedRate( new TimerTask() { @Override public void run() { // TODO Auto-generated method stub _count++; UpdateTime(); // Fails } }, 1000, 1000 ); } protected void UpdateTime() { _tv.setText( "" + _count ); } } 

=== TestTimerActivity.java ===

=== main.xml ===

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:gravity="center_horizontal" android:layout_height="wrap_content" android:layout_gravity="center" android:text="@string/header" android:id="@+id/TestViewHeader" android:textStyle="bold"/> <TextView android:layout_height="wrap_content" android:id="@+id/TextViewTime" android:layout_width="match_parent" android:layout_gravity="center_horizontal" android:gravity="center_horizontal" android:text="-"></TextView> </LinearLayout> 

=== main.xml ===

Самый первый вызов UpdateTime (from onCreate) завершает ОК, но тот же вызов от TimerTask :: run () не дает сообщение «Класс TestTimer неожиданно остановился».

Есть идеи? Где моя вина?


SY, TVT

Выполняйте операцию UpateTime () в потоке пользовательского интерфейса.

 protected void UpdateTime() { runOnUiThread(new Runnable() { public void run() { _tv.setText( "" + _count ); } }); } 

Надеюсь, решает вашу проблему.

Обновление пользовательского интерфейса из потока, отличного от UI / основного потока, не удастся, так как Android его не разрешает. Попробуйте использовать обработчик для отправки сообщений обратно в поток пользовательского интерфейса.

Или, возможно, попробуйте использовать AsyncTask, который представляет набор действительно простых методов обратного вызова для обработки потоков работника и пользовательского интерфейса. Но это может быть не совсем то, что вам нужно, так как вы пытаетесь проверить класс TimerTask.