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

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

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

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

Android

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

Android Studio

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

Q&A

解決済

2回答

1878閲覧

スレッドの終了後にある処理を行いたい

nagomi72

総合スコア51

Java

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

Android

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

Android Studio

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

0グッド

0クリップ

投稿2018/10/25 04:58

スレッド処理を初めて触るため、前提から誤っていることがあるかもしれませんが、都度ご指摘頂ければ幸いです。

後述するコードでは、四角を描画し、下へとずらして再描画することで四角を動かすといった処理を行なっています。
runメソッドでは、一定時間ごとに描画位置を変更し、再描画させています。

run内のflgがfalseになった時点でスレッドが終了する(四角の移動が終わる)のですが、スレッドの終了を検知して、別のスレッドを開始することは
できるのでしょうか。

とりあえずスレッドが終わったタイミングを掴みたいので、スレッド終了後にToastでも表示してみようと考え、デバッグで処理を追ったのですが、スレッドが終わった時点でアプリケーションが終了してしまい、どこにToastの記述をすればいいのか掴めていません。

お聞きしたい内容としては、
1.AとBというスレッドがあったとして、Aが終わったときにBを開始といったことはできるのか。

2.後述のコードで、runメソッド(スレッド?)が終わった後にToastを表示したい場合、
どこに記述すればいいいのか

3.後述のコードで

if (flg == false) { return; }

としているがこれでスレッドを終了させたことになるのか(四角の落下は止まるのですが、スレッドを終了させる場合、removeCallbacksを使うとあったので)

どれか1つでも構いません。ご教授頂ければ幸いです。

MainActivity.java

package com.example.drawmove; import android.os.Bundle; import android.os.Handler; import android.support.v7.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final MyView myView = (MyView)findViewById(R.id.my_view); final Handler handler = new Handler(); final Runnable r = new Runnable() { boolean flg = true; @Override public void run() { // UIスレッド //yの現在地を取得 myView.y = myView.youAreHere(); //まだ動くかどうかの判定 flg = myView.isDownMove(myView.y); if (flg == false) { return; } //描画位置変更 myView.Move(); //再描画 myView.invalidate(); handler.postDelayed(this, 1000); } }; handler.post(r); } }

MyView.java

package com.example.drawmove; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; import android.view.View; public class MyView extends View { Paint paint = new Paint(); int x = 660; int y = 250; int width = 710; int height = 300; public MyView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onDraw(Canvas canvas) { paint.setColor(Color.BLACK); paint.setStrokeWidth(1.0f); paint.setStyle(Paint.Style.FILL); canvas.drawRect(x,y,width,height, paint); } public void Move () { this.y = this.y + 50; this.height = this.height + 50; } public boolean isDownMove (int y) { boolean flg = true; if (y > 500) { flg = false; } return flg; } //yの現在の数値を返す public int youAreHere () { return this.y; } }

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.drawmove.MainActivity"> //パッケージ名+Viewクラス名とすることでButtonやらTextViewと同じように使える <com.example.drawmove.MyView android:id="@+id/my_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_alignParentBottom="true" android:layout_alignParentStart="true" /> </android.support.constraint.ConstraintLayout>

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

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

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

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

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

guest

回答2

0

スレッド関数が終了すると、スレッドは終了します
なので、その関数が終わるときに、別のスレッドを起動するとか、なにかを実行するとかいうことになります

投稿2018/10/25 05:03

y_waiwai

総合スコア87747

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

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

nagomi72

2018/10/25 07:17

ありがとうございます。 今回でいうと、returnの前でなにかしら行なう必要があるということですね…
y_waiwai

2018/10/25 07:32

そうですね。 まあ、finally使うとかすればいいんではないかと。
guest

0

ベストアンサー

UIThread以外のThreadでuiに関係する操作をすると落ちるはずです。
APIを呼び出すときに使う、AsyncTaskを使う方法はいかがでしょうか?

投稿2018/10/25 06:35

hinoko58

総合スコア112

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

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

nagomi72

2018/10/25 07:18

ExecutorService ,AsyncTaskを使うと実現できそうな気がしてきました。 調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問