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

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

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

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

Android

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

Q&A

解決済

1回答

1805閲覧

SurfaceViewを使用しているのですが、変数が反映されないです。かつ、描画内容が表示されなくなりました。

ko20vonobird

総合スコア50

Java

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

Android

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

0グッド

0クリップ

投稿2017/05/27 04:10

編集2017/05/27 07:35

###前提・実現したいこと
SurfaceViewを用いてUIスレッドと非同期の描画処理を行おうとしています。
そんな中で、以下の問題が発生しました。

###発生している問題・エラーメッセージ
エラーメッセージはありません。
変数が変わっているはずなのに反映されないです。
具体的には、privateな変数を用意して、Activityクラスから随時setで値を受け取りそれを反映させるというものなのですが、以前のUIスレッドに対して同期の処理をさせていたものから非同期のものに書き換えると変数が反映されなくなりました。

###修正していく中で新たに出た問題(追記)
SurfaceViewの記事を見て描画メソッドをrun()に、holderを渡さないように変えました(下のコードでholderを受け渡ししているのが古いもの)。すると、描画されなくなりました。run()はpublicです。

###該当のソースコード
Threadを使用している部分を抜粋しました。

java

1@Override 2 public void surfaceCreated(SurfaceHolder holder) { 3 isSurfaceStanby = true; 4 //test 5 thread = new Thread(); 6 thread.start(); 7 //test 8 //doDraw(holder);///test 9 }

java

1public void todraw() { 2 while (thread != null) {///test 3 doDraw(getHolder());///test 4 }///test 5 //test 6 try { 7 Thread.sleep(50); 8 }catch (Exception e){} 9 //test 10 }

・追記分

java

1 public C(Context context) { 2 super(context); 3 holder = getHolder(); 4 init(); 5 } 6 public C(Context context, AttributeSet attrs) { 7 super(context, attrs); 8 holder = getHolder(); 9 init(); 10 } 11 public C(Context context, AttributeSet attrs, int defStyleAttr) { 12 super(context, attrs, defStyleAttr); 13 holder = getHolder(); 14 init(); 15 } 16 public C(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 17 super(context, attrs, defStyleAttr, defStyleRes); 18 holder = getHolder(); 19 init(); 20 }

java

1public void run() { 2 Canvas canvas; 3 while (thread != null) { 4 //描画処理 5 try { 6 Thread.sleep(100); 7 }catch (Exception e) { 8 } 9 } 10}

Java

1@Override 2 public void surfaceCreated(SurfaceHolder holder) { 3 isSurfaceStanby = true; 4 //test 5 thread = new Thread(); 6 thread.start(); 7 //test 8 }

###試したこと
引数で値を渡したり、getを使ったりしてみたのですが結果は同じでした。

###補足情報
同時に加速度センサーを使用しているのですが、センサー精度が変化するときに呼ばれるonAccuracyChangedが常に呼び出される不具合が発生しています。
※上記の不具合は追記時の書き方を変えることによってなくなりました。
//testの記述は目印です、特に今回の質問とは関係ありません。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ただのThreadはstartしても**何もしません。**コード中で書いてる

java

1 thread = new Thread(); 2 thread.start();

は、無駄にThreadを作っただけで本当に何もしない無駄コードです。
Threadが非同期処理として機能するのは、Threadを継承したクラスでrunをオーバーライドしたクラスのインスタンスか、ThreadのコンストラクタにRunnableオブジェクトを渡した場合のみです。

つまり今回の場合、runの処理を非同期で行おうとしたら、このクラスにRunnableをimplementsして、Threadのコンストラクタにthisを渡してやる必要があります。

投稿2017/05/27 09:14

編集2017/05/27 09:30
swordone

総合スコア20651

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

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

ko20vonobird

2017/05/27 09:57 編集

回答ありがとうございます。 swordoneさんのおっしゃる通りに直させていただいたところ描画がされるようになりました。また、変数が反映されないという初期の問題も偶然解決することができました。 今回もありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問