前提・実現したいこと
AndroidStudioのRunnableインターフェースについて質問です。
Runnable内でテキストビュー内のテキストを変更しようとするとエラーが出てしまいます。
どうすれば改善されるでしょうか。
発生している問題・エラーメッセージ
01-27 04:05:35.554 32218-32259/? E/AndroidRuntime: FATAL EXCEPTION: Thread-4 Process: com.example.et.lanetaps, PID: 32218 android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6855) at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:1040) at android.view.View.requestLayout(View.java:19658) at android.view.View.requestLayout(View.java:19658) at android.view.View.requestLayout(View.java:19658) at android.view.View.requestLayout(View.java:19658) at android.support.constraint.ConstraintLayout.requestLayout(ConstraintLayout.java:1959) at android.view.View.requestLayout(View.java:19658) at android.view.View.requestLayout(View.java:19658) at android.view.View.requestLayout(View.java:19658) at android.widget.TextView.checkForRelayout(TextView.java:7367) at android.widget.TextView.setText(TextView.java:4479) at android.widget.TextView.setText(TextView.java:4336) at android.widget.TextView.setText(TextView.java:4311) at com.example.et.lanetaps.GameActivity.run(GameActivity.java:112) at java.lang.Thread.run(Thread.java:761)
該当のソースコード
Java
1package com.example.et.lanetaps; 2 3import android.annotation.SuppressLint; 4import android.content.pm.ActivityInfo; 5import android.app.Activity; 6import android.content.res.Resources; 7import android.icu.util.Calendar; 8import android.os.Build; 9import android.os.Bundle; 10import android.os.Handler; 11import android.support.annotation.RequiresApi; 12import android.util.Log; 13import android.view.MotionEvent; 14import android.view.SurfaceHolder; 15import android.view.SurfaceView; 16import android.widget.Button; 17import android.widget.TextView; 18 19import org.w3c.dom.Text; 20 21@RequiresApi(api = Build.VERSION_CODES.N) 22public class GameActivity extends Activity implements Runnable{ 23 24 public static Resources r; 25 public SurfaceView lane; 26 public MainSurfaceView mainSurfaceView; 27 28 public static TextView mTimetext; 29 30 public static long mTime; 31 public static long mTimeA; 32 public static long mTimeB; 33 34 public static long mm; 35 public static long ss; 36 37 public static String time; 38 public static String mSecond; 39 public static String mMinute; 40 41 Thread mThread; 42 43 @Override 44 protected void onCreate(Bundle savedInstanceState) { 45 super.onCreate(savedInstanceState); 46 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 47 setContentView(R.layout.activity_game); 48 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 49 50 lane = (SurfaceView)findViewById(R.id.lane); 51 mainSurfaceView = new MainSurfaceView(this , lane); 52 53 mTimetext = (TextView) findViewById(R.id.timer); 54 55 mTimeA = System.currentTimeMillis(); 56 57 r = getResources(); 58 59 mThread = new Thread(this); 60 mThread.start(); 61 } 62 63 @Override 64 public void run() { 65 while (mThread != null){ 66 mTimeB = System.currentTimeMillis(); 67 68 Log.d("timeA", String.valueOf(time)); 69 70 if (mTimeA + 1000 <= mTimeB) { 71 mTime++; 72 73 mm = mTime / 60; // 分 74 ss = mTime % 60; // 秒 75 76 if (mTime >= 60 ){ 77 ss = 0; 78 } 79 80 if (ss < 10){ 81 mSecond = "0" + ss; 82 }else { 83 mSecond = String.valueOf(ss); 84 } 85 if (mm < 10){ 86 mMinute = "0" + mm; 87 }else { 88 mMinute = String.valueOf(mm); 89 } 90 Log.d("aa" , String.valueOf(mm)); 91 92 time = mMinute + ":" + mSecond; 93 94 Log.d("time", time); 95 96 mTimetext.setText(time); 97 98 mTimeA = System.currentTimeMillis(); 99 } 100 } 101 102 } 103 104} 105
試したこと
Logで実際にどう表示されるのか試してみたのですが
表示(表示される数字)に関しては問題はなかったです。
補足情報(FW/ツールのバージョンなど)
AndroidStudio3.0.1

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。