4

基本的なタイマーをAndroidで動作させようとしていますが、onCreate()メソッドに次のコードがあります。

    editText = (EditText) findViewById(R.id.edit_message);
    Timer time = new Timer();     

    time.schedule(new TimerTask() {
        public void run() {
            timesince++;
            editText.setText("Timeran:"+timesince);
            Log.d("TIMER", "TimerTask run");
        }}, 0, 1000);

したがって、うまくいけば、テキストボックスを増加する値(timesince)で更新します。これは、editTextとともにプログラムの先頭で宣言されます...

ただし、(コンパイルの問題は発生しませんが)エミュレーターで実行すると、まったく機能しません。アプリは「blahblahblahが動作を停止しました...」と言います

私はタイマーを間違っていますか?私は何が欠けていますか?

どうもありがとう。

(このコードを削除するとPSアプリは正常に動作するため、このセクションに問題があることがわかります。)

編集:これは私のlogcat出力だと思います。テキストの壁でごめんなさい:

10-11 03:40:49.260: E/AndroidRuntime(561): FATAL EXCEPTION: Timer-0
10-11 03:40:49.260: E/AndroidRuntime(561): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
10-11 03:40:49.260: E/AndroidRuntime(561):  at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:3939)
10-11 03:40:49.260: E/AndroidRuntime(561):  at android.view.ViewRootImpl.invalidateChild(ViewRootImpl.java:714)
10-11 03:40:49.260: E/AndroidRuntime(561):  at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:763)
10-11 03:40:49.260: E/AndroidRuntime(561):  at android.view.ViewGroup.invalidateChild(ViewGroup.java:4012)
10-11 03:40:49.260: E/AndroidRuntime(561):  at android.view.View.invalidate(View.java:8454)
10-11 03:40:49.260: E/AndroidRuntime(561):  at android.widget.TextView.invalidateCursor(TextView.java:4319)
10-11 03:40:49.260: E/AndroidRuntime(561):  at android.widget.TextView.spanChange(TextView.java:7670)
10-11 03:40:49.260: E/AndroidRuntime(561):  at android.widget.TextView$ChangeWatcher.onSpanAdded(TextView.java:8020)
10-11 03:40:49.260: E/AndroidRuntime(561):  at android.text.SpannableStringBuilder.sendSpanAdded(SpannableStringBuilder.java:898)
10-11 03:40:49.260: E/AndroidRuntime(561):  at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:614)
10-11 03:40:49.260: E/AndroidRuntime(561):  at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:520)
10-11 03:40:49.260: E/AndroidRuntime(561):  at android.text.Selection.setSelection(Selection.java:76)
10-11 03:40:49.260: E/AndroidRuntime(561):  at android.text.Selection.setSelection(Selection.java:87)
10-11 03:40:49.260: E/AndroidRuntime(561):  at android.text.method.ArrowKeyMovementMethod.initialize(ArrowKeyMovementMethod.java:302)
10-11 03:40:49.260: E/AndroidRuntime(561):  at android.widget.TextView.setText(TextView.java:3244)
10-11 03:40:49.260: E/AndroidRuntime(561):  at android.widget.TextView.setText(TextView.java:3110)
10-11 03:40:49.260: E/AndroidRuntime(561):  at android.widget.EditText.setText(EditText.java:78)
10-11 03:40:49.260: E/AndroidRuntime(561):  at android.widget.TextView.setText(TextView.java:3085)
10-11 03:40:49.260: E/AndroidRuntime(561):  at com.example.cultivation.MainActivity$1.run(MainActivity.java:54)
10-11 03:40:49.260: E/AndroidRuntime(561):  at java.util.Timer$TimerImpl.run(Timer.java:284)
4

4 に答える 4

3
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

これが問題です

UIを更新するバックグラウンドタスクの部分をメインスレッドに移動するか、UIスレッドにmHandlerを作成する必要があります。

アップデート:

タイマーからのUIの更新:http://android-developers.blogspot.com/2007/11/stitch-in-time.html

于 2012-10-11T03:44:06.873 に答える
2

または、ハンドラーを使用してテキストビューの更新を実行します。

     private final Runnable mRunnable1 = new Runnable() {

     public void run() {
        timesince++;
        editText.setText("Timeran:"+timesince);
        Log.d("TIMER", "TimerTask run");

 mHandler.postDelayed(mRunnable1, 1000);
 }

 };

OnCreate()また、メソッド でこの行を呼び出しますmHandler.postDelayed(mRunnable1, 1000);

于 2012-10-11T03:48:47.527 に答える
0

TextViewUIスレッドからを更新してみてください。ハンドラーを使用してみてください。ここであなたはそれについての良い記事を見つけることができます。ハンドラーの助けを借りてテキストビューを更新します

于 2012-10-11T03:46:05.797 に答える
0

以下をせよ:

Timerをグローバル変数として宣言し、次のようなメソッドでtimer関数を呼び出します。

   public void startThread(){
    time.schedule(new TimerTask() {
    public void run() {
        timesince++;
        editText.setText("Timeran:"+timesince);
        Log.d("TIMER", "TimerTask run");
    }}, 0, 1000);
    }

startThread()でこの関数を呼び出しますonCreate()

于 2012-10-11T03:46:27.230 に答える