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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Android Studio

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

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

2回答

2895閲覧

AndroidStudioでkotlinを使ってタッチイベントをループで発生させる

tsu-ton

総合スコア7

Android Studio

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

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2019/02/21 14:35

編集2019/02/21 14:40

起動時の一度はタッチイベントを発生させることができていますが,While(true)で囲むとアプリは起動されるっぽいのですが白い画面のまま動きません.
ファイルの読み込み,型変換,タッチイベントの発生をループさせたいです.
AndroidStudio3.3.1を使用しています.

kotlin

1import android.os.Bundle 2import android.os.Handler 3import android.os.SystemClock 4import android.support.v7.app.AppCompatActivity 5import android.util.Log 6import android.view.GestureDetector 7import android.view.MotionEvent 8import android.widget.Toast 9 10 11 12 13 14 15class MainActivity:AppCompatActivity() { 16 internal var mGestureDetector: GestureDetector? = null 17 override fun onCreate(savedInstanceState: Bundle?) { 18 super.onCreate(savedInstanceState) 19 setContentView(R.layout.activity_main) 20 while(true) { 21 Handler().postDelayed(Runnable { 22 //assetsファイル読み込み 23 var a = getAssets().open("x測定値.txt").reader(charset = Charsets.UTF_8).use { it.readText() } 24 var b = getAssets().open("y測定値.txt").reader(charset = Charsets.UTF_8).use { it.readText() } 25 Log.d("val-a", a) 26 27 //読み込み数値の型変換 28 var message1: Float = a.toFloat() 29 var message2: Float = b.toFloat() 30 31 // タップなしでonTouchEventを発生させる 32 // デバッグなどで使用 33 val downTime = SystemClock.uptimeMillis() 34 val eventTime = SystemClock.uptimeMillis() + 100 35 val event = MotionEvent.obtain( 36 downTime, eventTime, MotionEvent.ACTION_DOWN, message1, message2, 0 37 ) 38 this.onTouchEvent(event) 39 }, 5000) 40 } 41 42 } 43 44 override fun onTouchEvent(event: MotionEvent): Boolean { 45 46 val posX = event.x 47 val posY = event.y 48 49 Toast.makeText( 50 application, 51 "タップしたョ\n" 52 + "座標( X:" + posX.toString().toString() 53 + ", Y:" + posY.toString().toString() + ")", 54 Toast.LENGTH_LONG 55 ).show() 56 57 return super.onTouchEvent(event) 58 } 59 } 60 61

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

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

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

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

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

guest

回答2

0

ベストアンサー

Handlerにpostしている処理を定期的に実行したいということであれば、whileループを使うのではなく、処理の最後で次の処理を再帰的にトリガーするようにすればよいでしょう。割とよく見かけるパターンです。

kotlin

1class MainActivity : AppCompatActivity() { 2 val handler = Handler() 3 val task = object : Runnable { 4 override fun run() { 5 // 任意の処理… 6 7 // 処理の最後で次のタスク開始を設定 8 handler.postDelayed(this, 5000) 9 } 10 } 11 12 override fun onCreate(savedInstanceState: Bundle?) { 13 ... 14 15 // 最初のタスク開始を設定 16 handler.postDelayed(task, 5000) 17 } 18 19 override fun onDestroy() { 20 ... 21 22 // タスクのループを終了 23 handler.removeCallbacks(task) 24 } 25}

もっとも、@jimbeさんが回答されている通り、ファイルの読み書きなどの時間のかかる処理は別スレッドで行うべきですので、TimerTask等で定期的に起動したスレッドにてファイルを読み込み、その結果をHandlerにpostするような方針に変えていただくのが望ましいと思います。

投稿2019/02/21 16:50

kakajika

総合スコア3131

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

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

tsu-ton

2019/02/22 16:18

なるほど... kakajikaさんのコードを参考に今のコードを,読み取り,型変換とタッチイベントの二つに分けてみました. しかし,a,bの値が同期できていない,onCreateに" Overriding method should call super.onCreate more... (Ctrl+F1)"と表示されたり,ほかにもエラーが出てしまいます. AndroidStudio自体,始めたばかりですので初歩的なことも理解できておりません... もしよろしければ,書き直したものを教えていただけませんでしょうか?
kakajika

2019/02/22 23:00

うーんと、別スレッドに分ける実装の方を先にやろうとしていますか?まずは回答で最初に書いたように、whileループを再帰的なタスクのループに変えるのを試してみてください。それ以外の箇所を変更する必要は無いはずです。 コードを丸ごと提示してしまってもいいですが、まずはご自分でエラーの内容を調べつつ修正していっていただくのが今後の為にもいいと思います。
tsu-ton

2019/02/23 08:36

アドバイスを参考に再帰的なタスクのループにすることはできました。 ありがとうございます。 しかし、ファイルの読み取りの値がアプリ起動時のまま変わらないのですが、途中でテキストファイルを更新することはできるのでしょうか?
kakajika

2019/02/24 08:24

もしかしたらassetsに置いたファイルを更新して反映させようとしていますか? 残念ながら、assetsに置いたファイルはアプリのビルド時に内包するものですので、ビルド後に内容を更新して即時反映させるといったことはできません。 そのようなことがやりたいのでしたら、端末のストレージにファイルを置くか、サーバー上に置いてネットワーク経由で読み込むようにしてみてください。
tsu-ton

2019/02/25 03:14

なるほど、分かりました! 詳しくありがとうございます!
guest

0

onCreate で無限ループを行うと, Android システムに制御が戻りませんので, 画面の描画やタッチ処理などが行われなくなります.
ですので, ほぼ全ての on~ 系のメソッドでは無限ループに限らず, 時間のかかる処理は行わないようにとされています.
時間のかかる処理や定期的に行う処理等は, スレッドを作成して実行するようにしてください.

投稿2019/02/21 15:35

jimbe

総合スコア12545

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問