質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

2回答

4177閲覧

Runnableインターフェース内でのテキストビュー変更のエラー

.LEN.

総合スコア4

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2018/01/27 04:18

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

エラーになる理由は既出の通りですが、Threadを用いた処理のままTextViewの出力をUIスレッドに担わせるには、Activity#runOnUiThread()を用いる方法もあります。メソッド名の字の如く、UIスレッドで実行させたい処理を記述することができます。こんな感じになるでしょう。

Java

1public class GameActivity extends Activity implements Runnable{ 2 3 // 中略 4 5 @Override 6 public void run() { 7 while (mThread != null){ 8 9 // 中略 10 11 runOnUiThread(new Runnable() { 12 @Override 13 public void run() { 14 mTimetext.setText(time); 15 } 16 }); 17 18 // 以下略

投稿2018/01/28 09:48

keicha_hrs

総合スコア6768

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

new Thread()からの操作だからです。
TextViewなどのUIの操作はUIのスレッド(簡単に言うなら、このActivityを実行しているスレッド)からしか操作できません。
AsyncTaskなどの非同期処理を行うクラスを使うなどする必要があります。

投稿2018/01/27 04:33

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問