回答編集履歴
2
指摘を受けて例示コードを改修
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
余談を書こうとしたので見出しをつけたけど、やめたのでいらなかった・・・
answer
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
#### 本題
|
2
1
|
ざっとですが、こうしたらどうかという案を考えてみました。まずコードです。変更点とその周辺のみを記述しています。
|
3
2
|
|
4
3
|
MainActivity.java
|