android javaでyoutubeにあったRoomでデータベース構築を行い、ソースコードをコピペして作ったのですが、動画ですと上手く動いているのに私の場合なぜか動きません。。。
実現したいこと
https://www.youtube.com/watch?v=PAGVed1Rkfc&t=99s
上記のリンクは、前編になっていますが中編と後編に分かれています。
発生している問題・エラーメッセージ
ビュー階層を作成した元のスレッドだけが、そのビューに触れることができます。
というエラーが出ます。
エラーメッセージ E/AndroidRuntime: FATAL EXCEPTION: pool-4-thread-1 Process: jp.ac.jec.cm0110.roomdb, PID: 27833 android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6871) at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:1079) at android.view.ViewGroup.invalidateChild(ViewGroup.java:5242) at android.view.View.invalidateInternal(View.java:13625) at android.view.View.invalidate(View.java:13589) at android.view.View.invalidate(View.java:13573) at android.widget.TextView.checkForRelayout(TextView.java:7350) 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 jp.ac.jec.cm0110.roomdb.MainActivity$1.run(MainActivity.java:116) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) at java.lang.Thread.run(Thread.java:761) ### 該当のソースコード ```MainActivity.java import androidx.appcompat.app.AppCompatActivity; import androidx.room.Room; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import java.util.Calendar; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private TextView roomtext1; private TextView roomtext2; private TextView roomtext3; private TextView roomtextdebug; private TextView roomtextmax; private Button roombtnleft; private Button roombtnright; private Button roombtnadd; private Button roombtndelete; private Button roombtnalldelete; private String monthtext; private String daytext; private String hourtext; private String minutetext; private String secondtext; private int listpage = 1; private int listmax = 0; private int listid = 0; private List<RoomEntity> list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); roomtext1 = findViewById(R.id.roomtext1); roomtext2 = findViewById(R.id.roomtext2); roomtext3 = findViewById(R.id.roomtext3); roomtextdebug = findViewById(R.id.roomtextdebug); roomtextmax = findViewById(R.id.roomtextmax); roombtnleft = findViewById(R.id.roombtnleft); roombtnleft.setOnClickListener(this); roombtnright = findViewById(R.id.roombtnright); roombtnright.setOnClickListener(this); roombtnadd = findViewById(R.id.roombtnadd); roombtnadd.setOnClickListener(this); roombtndelete = findViewById(R.id.roombtndelete); roombtndelete.setOnClickListener(this); roombtnalldelete = findViewById(R.id.roombtnalldelete); roombtnalldelete.setOnClickListener(this); loaddb(); } private void loaddb() { ExecutorService executor = Executors.newSingleThreadExecutor(); executor.execute(new Runnable() { @Override public void run() { RoomTimeDatabase db = Room.databaseBuilder(getApplicationContext(), RoomTimeDatabase.class, "roomtime").build(); RoomTimeDao dao = db.roomtimedao(); list = dao.getall(); listmax = list.size(); if(list.size() > 0) { RoomEntity entity = list.get(listpage - 1); int year = entity.getyear(); int month = entity.getmonth(); if(month < 10) { monthtext = "0" + month; } else { monthtext = "" + month; } int day = entity.getday(); if(day < 10) { daytext = "0" + day; } else { daytext = "" + day; } int hour = entity.gethour(); if(hour < 10) { hourtext = "0" + hour; } else { hourtext = "" + hour; } int minute = entity.getminute(); if(minute < 10) { minutetext = "0" + minute; } else { minutetext = "" + minute; } int second = entity.getsecond(); if(second < 10) { secondtext = "0" + second; } else { secondtext = "" + second; } listid = entity.getId(); roomtext2.setText(year + ":" + monthtext + ":" + daytext + ":" + hourtext + ":" + minutetext + ":" + secondtext); roomtext3.setText(listpage + "/" + listmax); roomtextmax.setText("データ保存数:" + listmax); } else { roomtext3.setText("データ無し"); roomtext2.setText(""); roomtextmax.setText("データ保存数:0"); roomtextdebug.setText(""); } } }); } private void writedb() { ExecutorService executor = Executors.newSingleThreadExecutor(); executor.execute(new Runnable() { @Override public void run() { try { Calendar c = Calendar.getInstance(); int year = c.get(Calendar.YEAR); int month = c.get(Calendar.MONTH) + 1; int day = c.get(Calendar.DATE); int hour = c.get(Calendar.HOUR); int minute = c.get(Calendar.MINUTE); int second = c.get(Calendar.SECOND); RoomTimeDatabase db = Room.databaseBuilder(getApplicationContext(), RoomTimeDatabase.class, "roomtime").build(); RoomTimeDao dao = db.roomtimedao(); RoomEntity entity = new RoomEntity(year, month, day, hour, minute, second); dao.insert(entity); roomtextdebug.setText("書き込み完了"); listpage = listmax + 1; loaddb(); } catch(Exception e) { roomtextdebug.setText("エラー"); } } }); } private void deletedb() { ExecutorService executor = Executors.newSingleThreadExecutor(); executor.execute(new Runnable() { @Override public void run() { try { RoomTimeDatabase db = Room.databaseBuilder(getApplicationContext(), RoomTimeDatabase.class, "roomtime").build(); RoomTimeDao dao = db.roomtimedao(); dao.delete(listid); listpage = 1; loaddb(); } catch (Exception e) { roomtextdebug.setText("エラー"); } } }); } private void deletealldb() { ExecutorService executor = Executors.newSingleThreadExecutor(); executor.execute(new Runnable() { @Override public void run() { try { RoomTimeDatabase db = Room.databaseBuilder(getApplicationContext(), RoomTimeDatabase.class, "roomtime").build(); RoomTimeDao dao = db.roomtimedao(); dao.deleteall(); listpage = 1; loaddb(); } catch (Exception e) { roomtextdebug.setText("エラー"); } } }); } @Override public void onClick(View v) { switch(v.getId()) { case(R.id.roombtnadd): writedb(); break; case(R.id.roombtnleft): if(listpage > 1) { listpage -= 1; loaddb(); roomtextdebug.setText(""); } break; case(R.id.roombtnright): if(listpage < listmax) { listpage += 1; loaddb(); roomtextdebug.setText(""); } break; case(R.id.roombtndelete): deletedb(); break; case(R.id.roombtnalldelete): deletealldb(); break; } } }
MainActivityでエラーが発生しているので載せておきます。
残りのMainActivity.java以外のファイルは、下記のgithubと同様です。(コピペ)
https://gist.github.com/uta-water/02b913db4db5c20f3bde38e417246a07
試したこと
https://accelebiz.hatenablog.com/entry/2016/09/01/061934
このように、エラーメッセージで検索して出てきた対処法は試しました。
補足情報(FW/ツールのバージョンなど)
android stujioは、Bumblebee|2021.1.1Patch2でMinimum SDKは、API23です。

回答1件
あなたの回答
tips
プレビュー