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

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

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

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

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

Q&A

解決済

2回答

4254閲覧

Android Studio でループ処理で1秒ごとにカウントを表示させたい

yasiko

総合スコア6

Java

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

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

0グッド

0クリップ

投稿2021/09/27 08:27

編集2021/09/27 10:06

Android stdioでループ処理で1秒ごとにカウントを表示させたいのですが、うまくいきません。

xmlでテキストビューを一つ配置しました。

実行はできるのですが一瞬で落ちてしまいます。どこが悪いのでしょうか?
詳しい方教えてください。

java

1package net.npaka.audiorec20210927; 2 3import android.app.Activity; 4import android.os.Bundle; 5import android.widget.TextView; 6 7public class MainActivity extends Activity 8{ 9 public TextView TEXT; 10 public Thread thread; 11 12 public int co=0; 13 14 @Override 15 protected void onCreate(Bundle savedInstanceState) 16 { 17 super.onCreate(savedInstanceState); 18 setContentView(R.layout.activity_main); 19 TEXT = findViewById(R.id.textView); 20 TEXT.setText("アクティビティ起動時"); 21 22 23 new Thread(new Runnable()//ループ 24 { 25 @Override 26 public void run() 27 { 28 // マルチスレッドにしたい処理 ここから 29 try//?? 30 { 31 co++; 32 thread.sleep(1000); 33 TEXT.setText("ループNo." + co); 34 35 } 36 catch (InterruptedException e)//?? 37 { 38 39 } 40 41 // マルチスレッドにしたい処理 ここまで 42 } 43 }).start(); 44 } 45 46 47}

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

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

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

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

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

K_3578

2021/09/27 08:33

>Android stdio Android Studioのtypoでは? 因みにAndroid Studioタグもあるのでそうであればそちらのタグを入れてAndroidタグを外すと良いかと。
jimbe

2021/09/27 09:47

AndroidStudio のタグは、本来は AndroidStudio 自体に関する質問で使うので、単に開発環境として使っているだけの場合には適さないのではないでしょうか。 (android studio 以外の開発環境でも「実行したら落ちる」のは同じでしょう。) 変えて頂くならタイトル等の「Android st(u)dioで」という表現のほうかと思います。
jimbe

2021/09/27 09:53

> 実行はできるのですが一瞬で落ちてしまいます 基本的には、落ちた時にログがどこかしらに出ているはずです。 logcat 等をご確認頂いて、具体的に何が起きているのかを調べてみては如何でしょうか。
yasiko

2021/09/27 10:05

Android Studioですね。綴り間違えてました。
guest

回答2

0

Handler#postDelayed を用いては如何でしょうか。


java

1import androidx.appcompat.app.AppCompatActivity; 2 3import android.os.*; 4import android.widget.TextView; 5 6public class MainActivity extends AppCompatActivity { 7 private TextView textView; 8 private int count = 0; 9 10 @Override 11 protected void onCreate(Bundle savedInstanceState) { 12 super.onCreate(savedInstanceState); 13 setContentView(R.layout.activity_main); 14 15 textView = findViewById(R.id.textView); 16 textView.setText("アクティビティ起動時"); 17 18 Handler handler = new Handler(getMainLooper()); 19 postLoop(handler, 1000); //[ms] 20 } 21 22 private void postLoop(Handler handler, int delayMillis) { 23 handler.postDelayed(() -> { 24 textView.setText("ループNo." + ++count); 25 postLoop(handler, delayMillis); 26 }, delayMillis); 27 } 28}

投稿2021/09/27 10:51

編集2021/09/27 11:05
jimbe

総合スコア13209

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

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

yasiko

2021/09/28 01:15

解答ありがとうございます。 こちらも正常にカウントアップしました。
guest

0

ベストアンサー

UIスレッド以外からUI操作をしたからだと思います。
setTextをUIスレッドで実行させる(Handler を使う)等でしょうか

投稿2021/09/27 08:33

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yasiko

2021/09/27 09:47

ハンドラを使うとすぐには落ちず、一回カウントアップできました。 ループ処理はできないのでしょうか? protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TEXT = findViewById(R.id.textView); TEXT.setText("起動時"); //UIスレッドはメイン的なもの Handler handler = new Handler(); // ハンドラー  UIスレッドで実行できるようにする。 handler.post(new Runnable() { @Override public void run() { // マルチスレッドにしたい処理 ここから try { thread.sleep(1000); co++; TEXT.setText("ループNo." + co); } catch (InterruptedException e) { } return; } } );//start();;tukaenai }
退会済みユーザー

退会済みユーザー

2021/09/27 09:55

例えばですが 以下のように 実際にUIにアクセスする部分だけを切り出すイメージです new Thread(new Runnable()//ループ { @Override public void run() { // マルチスレッドにしたい処理 ここから try//?? { co++; thread.sleep(1000); handler.post(new Runnable() { @Override public void run() { TEXT.setText("ループNo." + co); } }); } catch (InterruptedException e)//?? { } // マルチスレッドにしたい処理 ここまで } }).start();
yasiko

2021/09/27 10:03

返信ありがとうございます。イメージはなんとなく掴めました。 ↑のコードに変えてみたのですが、落ちてしまいました。 public class MainActivity extends Activity { public TextView TEXT; public Thread thread; private Handler handler; public int co=0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TEXT = findViewById(R.id.textView); TEXT.setText("起動時"); new Thread(new Runnable()//ループ { @Override public void run() { // マルチスレッドにしたい処理 ここから try//?? { co++; thread.sleep(1000); handler.post(new Runnable() { @Override public void run() { TEXT.setText("ループNo." + co); } }); } catch (InterruptedException e)//?? { } // マルチスレッドにしたい処理 ここまで } }).start(); } }
退会済みユーザー

退会済みユーザー

2021/09/27 10:07

直前では //UIスレッドはメイン的なもの Handler handler = new Handler(); // ハンドラー  UIスレッドで実行できるようにする。 こうされていたかと思いますが handler変数が初期化されていないからだと思います。 private Handler handler = new Handler(); とされてみてはいかがでしょう
yasiko

2021/09/27 10:23

落ちなくはなるのですが、カウントアップは一回しかしてくれませんでした。orz public class MainActivity extends Activity { public TextView TEXT; public Thread thread; public int co=0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TEXT = findViewById(R.id.textView); TEXT.setText("起動時"); //Handler handler = new Handler(); new Thread(new Runnable()//ループ { private Handler handler = new Handler(); @Override public void run() { // マルチスレッドにしたい処理 ここから try//?? { co++; thread.sleep(1000); handler.post(new Runnable() { @Override public void run() { TEXT.setText("ループNo." + co); } }); } catch (InterruptedException e)//?? { } // マルチスレッドにしたい処理 ここまで } }).start(); } }
退会済みユーザー

退会済みユーザー

2021/09/27 10:45

原因を探す手段として、 Logを出してcoがどう変わっていくかを確認してみるのはどうでしょうか 例えば TEXT.setText("ループNo." + co); の下に Log.d("MainActivity", "ループNo." + co) を入れてみると 毎秒ここが動いていたら AndroidStudio下の方の Logcatというところにでてきます
退会済みユーザー

退会済みユーザー

2021/09/27 11:24

整形してみてみましたが、 Threadのrun内がループしてないみたいですね runの中身を while(True){}で囲うと繰り返し動くと思います jimbeさんも回答されてますが、そちらのほうが実装がシンプルで良いかもしれません
yasiko

2021/09/28 01:12 編集

while(true){try.....}で正常にテキストが更新されカウントアップしました。 またlogcatで変数の中身が見れることを初めて知りました。 Log.d()も正常に動作してました。 親身にありがとうございましたorz
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問