皆様、いつもお世話になっております。 今回も、少々困ったことになっており、皆様のお知恵をお借りしたく願います。
皆様、いつもお世話になっております。 今回も、少々困ったことになっており、皆様のお知恵をお借りしたく願います。 私は、Win10Pro 64bitのOSでAndroidのアプリの開発をしております。 プログラムも佳境に向かい、いよいよゴールが見えてきたと思っていたところ、不慮の不具合に見舞われました。 内容は、タイマがうまく回らなくなってしまったことです。そのため、チェック用に動作確認としてのサンプルプログラムを作ったのですが、これも思ったようには動きません。 まずは、その内容を以下に。 Package com.example.アプリ名 import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import java.util.Timer; import java.util.TimerTask; public class MainActivity extends AppCompatActivity { public static int lcnt1 = 0; public static String str; public static Timer timer1 = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button btn_start = (Button)findViewById(R.id.button_1); btn_start.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (timer1 == null) { timer1 = new Timer(); timer1.schedule(new TimerTask() { @Override public void run() { lcnt1++; str = "Count_no1 = " + lcnt1; TextView textview1 = findViewById(R.id.TextView1); textview1.setText(str); } }, 0, 100); } } }); } } と、簡単に書くとこうなります。当然終了処理も記述しておりますが、文字数の都合で割愛させていただいております。 何をしたいかといいますと、スタートボタンを押すと、タイマが回り、カウンタがインクリメントするので、その値をテキストビューにて表示したいのです。 が、”textview1.setText(str);”の部分でブレークアウトしてアプリが終了します。 タイマなしならば文字の更新は行えます。タイマ中でも、この行をコメントにすれば抜け出しません。 何か根本的なと所で引っかかっていると思い、本、ウェブをよく読んでみたのですが、こんがらがる一方です。また、使用している関数、マクロなどの構文も現バージョン身は未対応のようで、コンパイルにまで持って行けません。 最終的には、おのおの違う速度のタイマを並列に回したいと思っています。 Win10pro 64bit Android studio 4.1.3 です。 なにとぞ、よろしくお願い申し上げます。 宮崎 啓介
Android開発・36閲覧
ベストアンサー
AndroidのView更新はUIスレッド上でしかできないルールです。 タイマー処理はワーカースレッドで行われるため、タイマー処理内でView更新をするとエラーになります。 よって View操作部分をUIスレッドに投げましょう 例) String str = "Count_no1 = " + lcnt1; //以下のブロックをUIスレッドで動かず runOnUiThread(() -> { TextView textview1 = findViewById(R.id.TextView1); textview1.setText(str); }); 後半の > コンパイルにまで持って行けません。 は意味が分かりませんでした。 コンパイルできないなら、実行エラーであるタイマーで落ちる現象にならないのでは?
質問者からのお礼コメント
誠にありがとうございました。 問題は解決しました。 >コンパイルまで持って行けません。 は、サンプルプログラムを丸写しをすると、構文に赤いエラーが出て、進めないと言うことです。 また、自力では問題の解決には届きませんでした。 今回、全く未知のことでしたので、皆様に頼らせていただいて助かりました。 誠にありがとうございました。
お礼日時:4/24 7:42