teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

指摘を受けて例示コードを改修

2018/04/19 13:04

投稿

keicha_hrs
keicha_hrs

スコア6768

answer CHANGED
@@ -67,4 +67,91 @@
67
67
 
68
68
  そして、scheduleAtFixedRate()に記述したrun()の中では、update()を直接呼ぶのではなく、runOnUiThread()を呼び出すように変更します。これは、メソッド名を呼んで字の如くで、UIスレッドで処理して欲しい内容を他スレッドから渡すためのメソッドです。これはActivityが持つメソッドなので、mainを参照して呼び出します。その引数として、Runnableを実装したBallのインスタンスを渡すようにします。
69
69
 
70
- こんな感じでどうでしょうかね?テストしていない(できない)ので動く保証はできませんが・・・。
70
+ こんな感じでどうでしょうかね?テストしていない(できない)ので動く保証はできませんが・・・。
71
+
72
+ ---
73
+
74
+ (2017/04/19追記)
75
+ kakajikaさんのご指摘を受けて書き直したものです。前のものは残しておきます。
76
+
77
+ MainActivity.java
78
+ ```Java
79
+ // SimulationView.OnSimulationUpdateListenerを実装(implements)
80
+ public class MainActivity extends AppCompatActivity implements SimulationView.OnSimulationUpdateListener {
81
+
82
+ @Override
83
+ protected void onCreate(Bundle savedInstanceState) {
84
+ super.onCreate(savedInstanceState);
85
+ setContentView(R.layout.activity_main);
86
+
87
+ // Listenerをセットする
88
+ SimulationView simview = findViewById(R.id.canvas);
89
+ simview.setOnSimulationUpdateListener(this);
90
+
91
+ setBarText();
92
+ }
93
+
94
+
95
+ //壁に当たった時に呼ばれる
96
+ @Override
97
+ public void countUpBarText(int key) {//textviewを変更する
98
+ // この中は変更なし
99
+ }
100
+ }
101
+
102
+ ```
103
+ SimulationView.java
104
+ ```Java
105
+ public class SimulationView extends SurfaceView implements SurfaceHolder.Callback {
106
+
107
+ //private MainActivity main; // これはやめる
108
+ private OnSimulationUpdateListener mListener; // 追加
109
+
110
+ void setOnSimulationUpdateListener(OnSimulationUpdateListener listener) {
111
+ mListener = listener;
112
+ }
113
+
114
+ public void startnow() {
115
+ ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
116
+ executor.scheduleAtFixedRate(new Runnable() {
117
+ @Override
118
+ public void run() {
119
+ post(ball); // post()に変更
120
+ Log.d("test", "ループ");
121
+ draw();
122
+ }
123
+ }, 100, 100, TimeUnit.MICROSECONDS);
124
+ }
125
+
126
+ class Ball implements Runnable {
127
+
128
+ // run()の中でupdate()を呼ぶ
129
+ @Override
130
+ public void run() {
131
+ update();
132
+ }
133
+
134
+ void update() {
135
+ //右壁
136
+ if (x < 0) {
137
+ checkBar = 1;
138
+ mListener.countUpBarText(checkBar); // mListenerを参照
139
+ dx = -dx;
140
+ }
141
+
142
+ // 以降、同様にmainをmListenerに置き換える
143
+
144
+ }
145
+ }
146
+
147
+ interface OnSimulationUpdateListener {
148
+ void countUpBarText(int key);
149
+ }
150
+ }
151
+ ```
152
+
153
+ interfaceの解説をするのはちょっと辛いので、書籍やネットの資料を参考にしてください。やっていることの趣旨としては、前とさほど違いはありません。
154
+
155
+ > kakajikaさん
156
+
157
+ こんなところでどうでしょうか・・・。(あまり自信ない)

1

余談を書こうとしたので見出しをつけたけど、やめたのでいらなかった・・・

2018/04/19 13:04

投稿

keicha_hrs
keicha_hrs

スコア6768

answer CHANGED
@@ -1,4 +1,3 @@
1
- #### 本題
2
1
  ざっとですが、こうしたらどうかという案を考えてみました。まずコードです。変更点とその周辺のみを記述しています。
3
2
 
4
3
  MainActivity.java