0

基本的に、フラグメント内で TimerTask を使用する必要がありますが、次のエラーが表示されます。

04-04 15:01:02.710 28397-28528/com.example.sdilab.pap E/AndroidRuntime: FATAL EXCEPTION: Timer-1
    android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
    at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:5471)
    at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:1007)
    at android.view.View.requestLayout(View.java:15850)
    at android.view.View.requestLayout(View.java:15850)
    at android.view.View.requestLayout(View.java:15850)
    at android.view.View.requestLayout(View.java:15850)
    at android.view.View.requestLayout(View.java:15850)
    at android.view.View.requestLayout(View.java:15850)
    at android.support.v4.widget.DrawerLayout.requestLayout(DrawerLayout.java:1255)
    at android.view.View.requestLayout(View.java:15850)
    at android.view.View.requestLayout(View.java:15850)
    at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:334)
    at android.view.View.requestLayout(View.java:15850)
    at android.view.View.requestLayout(View.java:15850)
    at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:334)
    at android.view.View.requestLayout(View.java:15850)
    at android.view.View.requestLayout(View.java:15850)
    at android.widget.TextView.checkForRelayout(TextView.java:6615)
    at android.widget.TextView.setText(TextView.java:3753)
    at android.widget.TextView.setText(TextView.java:3608)
    at android.widget.TextView.setText(TextView.java:3583)
    at com.example.sdilab.pap.StepsFragment$1.run(StepsFragment.java:87)
    at java.util.Timer$TimerImpl.run(Timer.java:284)

そして、これは私が使用する必要があるコードです:

timer.schedule( new TimerTask() {
            public void run() {
                double value = Double.parseDouble(readFromFile());
                String roundedvalue = Math.round(passos) + "";
                textView.setText(roundedvalue);

            }
        }, 0, 1*1000);

私の質問は次のとおりです。このコードを使用して同じ結果を得るにはどうすればよいですか?

4

3 に答える 3

0

あなたの問題は、メイン スレッドの外でビューを更新しようとしていることです。これに対処する簡単な方法は、ハンドラーを使用してビューを正しい方法で更新していることを確認することです。次に例を示します。

private Handler updateHandler = new Handler();

timer.schedule( new TimerTask() {
        public void run() {
            double value = Double.parseDouble(readFromFile());
            String roundedvalue = Math.round(passos) + "";
            updateHandler.postRunnable(new Runnable() {
                public void run() {
                    textView.setText(roundedvalue); 
                }
            });
        }
    }, 0, 1*1000);

runOnUiThread()アクティビティ内にいる場合は、同じことを行うメソッドもあります。

于 2016-04-04T14:11:23.537 に答える