回答編集履歴

2

コード等を追加

2019/03/04 16:29

投稿

jimbe
jimbe

スコア12659

test CHANGED
@@ -43,3 +43,281 @@
43
43
  メインスレッドは常に使われております.
44
44
 
45
45
  OkHttp は, おそらく call.enqueue によってスレッドが使用されていると思います.
46
+
47
+
48
+
49
+ ---
50
+
51
+
52
+
53
+ かなり豪快なコードになっていると思います.
54
+
55
+
56
+
57
+ > //この1行を追加しました。
58
+
59
+ > new MainActivity().CompAnswer(Looper.getMainLooper(),response.body().string());
60
+
61
+
62
+
63
+ Activity は Android システムが管理していますので, 勝手に生成しても Activity としては機能いたしません. ですので findViewById が null を返しているのではないでしょうか.
64
+
65
+ 必要であれば okhttp3Client のパラメータとして受け取って使用してください.
66
+
67
+
68
+
69
+ また逆に CompAnswer は Looper をパラメータとして受け取って Handler を生成していますが, CompAnswer は MainActivity のメソッドですので, MainActivity で先に生成済みの ```Handler handler = new Handler();``` の handler が使用できると思います.
70
+
71
+
72
+
73
+
74
+
75
+ コード量と動作を考えますと, HttpClient クラスがあることによって動作イメージが崩れているのではないでしょうか. クラス分けは大事ですが, この場合 Http の処理は OkHttp が行っていますので, いっそ HttpClient クラスは無いほうが良いと思います.
76
+
77
+ (ついでですが, 各ボタンのリスナを全て同じにした上でリスナ内でボタンにより分岐するのでは無く, 専用処理があるボタンには専用リスナを設定したほうが分かり易いと思います.)
78
+
79
+
80
+
81
+ ```java
82
+
83
+ package com.example.hogehoge.calculater;
84
+
85
+
86
+
87
+ import android.os.Bundle;
88
+
89
+ import android.os.Handler;
90
+
91
+ import android.support.v7.app.AppCompatActivity;
92
+
93
+ import android.view.View;
94
+
95
+ import android.widget.Button;
96
+
97
+ import android.widget.TextView;
98
+
99
+
100
+
101
+ import java.io.IOException;
102
+
103
+
104
+
105
+ import okhttp3.*;
106
+
107
+
108
+
109
+ public class MainActivity extends AppCompatActivity {
110
+
111
+
112
+
113
+ TextView formulaTextView;
114
+
115
+ Handler handler = new Handler();
116
+
117
+
118
+
119
+ @Override
120
+
121
+ protected void onCreate(Bundle savedInstanceState) {
122
+
123
+ super.onCreate(savedInstanceState);
124
+
125
+ setContentView(R.layout.activity_main);
126
+
127
+
128
+
129
+ formulaTextView = (TextView) findViewById(R.id.formula);
130
+
131
+
132
+
133
+ View.OnClickListener NumListener = new View.OnClickListener() {
134
+
135
+ @Override
136
+
137
+ public void onClick(View view) {
138
+
139
+ formulaTextView.append(((Button)view).getText());
140
+
141
+ }
142
+
143
+ };
144
+
145
+
146
+
147
+ findViewById(R.id.num1).setOnClickListener(NumListener);
148
+
149
+ findViewById(R.id.num2).setOnClickListener(NumListener);
150
+
151
+ findViewById(R.id.num3).setOnClickListener(NumListener);
152
+
153
+ findViewById(R.id.num4).setOnClickListener(NumListener);
154
+
155
+ findViewById(R.id.num5).setOnClickListener(NumListener);
156
+
157
+ findViewById(R.id.num6).setOnClickListener(NumListener);
158
+
159
+ findViewById(R.id.num7).setOnClickListener(NumListener);
160
+
161
+ findViewById(R.id.num8).setOnClickListener(NumListener);
162
+
163
+ findViewById(R.id.num9).setOnClickListener(NumListener);
164
+
165
+ findViewById(R.id.num0).setOnClickListener(NumListener);
166
+
167
+
168
+
169
+ findViewById(R.id.coron).setOnClickListener(NumListener);
170
+
171
+
172
+
173
+ findViewById(R.id.add).setOnClickListener(NumListener);
174
+
175
+ findViewById(R.id.substract).setOnClickListener(NumListener);
176
+
177
+ findViewById(R.id.divide).setOnClickListener(NumListener);
178
+
179
+ findViewById(R.id.multiply).setOnClickListener(NumListener);
180
+
181
+
182
+
183
+ findViewById(R.id.NEXT_INT).setOnClickListener(new View.OnClickListener() {
184
+
185
+ @Override
186
+
187
+ public void onClick(View view) {
188
+
189
+ formulaTextView.append(" ");
190
+
191
+ }
192
+
193
+ });
194
+
195
+ findViewById(R.id.Clear).setOnClickListener(new View.OnClickListener() {
196
+
197
+ @Override
198
+
199
+ public void onClick(View view) {
200
+
201
+ formulaTextView.setText("");
202
+
203
+ }
204
+
205
+ });
206
+
207
+ findViewById(R.id.equal).setOnClickListener(new View.OnClickListener() {
208
+
209
+ @Override
210
+
211
+ public void onClick(View view) {
212
+
213
+ okhttp3Client(formulaTextView.getText().toString());
214
+
215
+ }
216
+
217
+ });
218
+
219
+ findViewById(R.id.BACK).setOnClickListener(new View.OnClickListener() {
220
+
221
+ @Override
222
+
223
+ public void onClick(View view) {
224
+
225
+ Button button = (Button) view;
226
+
227
+ if (formulaTextView.length() > 0 && formulaTextView.getText() != null) {
228
+
229
+ String temp = formulaTextView.getText().toString();
230
+
231
+ temp = temp.substring(0, temp.length() - 1);
232
+
233
+ formulaTextView.setText(temp);
234
+
235
+ }
236
+
237
+ }
238
+
239
+ });
240
+
241
+ }
242
+
243
+
244
+
245
+ void okhttp3Client(final String formula) {
246
+
247
+ String url = "http://hogehoge.site";
248
+
249
+ OkHttpClient client = new OkHttpClient();
250
+
251
+
252
+
253
+ try {
254
+
255
+ Request request = new Request.Builder()
256
+
257
+ .url(url)
258
+
259
+ .post(RequestBody.create(MediaType.parse("text/plain;charset=utf-8"), formula))
260
+
261
+ .build();
262
+
263
+ Call call = client.newCall(request);
264
+
265
+ call.enqueue(new Callback() {
266
+
267
+ @Override
268
+
269
+ public void onFailure(Call call, IOException e) {
270
+
271
+ //エラー処理を書く
272
+
273
+ }
274
+
275
+ @Override
276
+
277
+ public void onResponse(Call call, Response response) throws IOException {
278
+
279
+ //この1行を追加しました。
280
+
281
+ compAnswer(response.body().string());
282
+
283
+ }
284
+
285
+ });
286
+
287
+ } catch(Exception e) {
288
+
289
+
290
+
291
+ }
292
+
293
+ }
294
+
295
+
296
+
297
+ //以下のメソッドを新しく追加しました。
298
+
299
+ private void compAnswer(final String Answer) {
300
+
301
+ handler.post(new Runnable() {
302
+
303
+ @Override
304
+
305
+ public void run() {
306
+
307
+
308
+
309
+ //このテキストビューまでは到達できました。
310
+
311
+ //実行しようとするとアプリ自体が落ちることは確認できました。
312
+
313
+ formulaTextView.setText(Answer);
314
+
315
+ }
316
+
317
+ });
318
+
319
+ }
320
+
321
+ }
322
+
323
+ ```

1

記述間違い

2019/03/04 16:29

投稿

jimbe
jimbe

スコア12659

test CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
 
14
14
 
15
- この run() とは Handler で実行したい処理のことでしょうか. でしたら, Runnable を実装したクラスの中に書かなければなりません. そのクラスのインスタンスを Thread の post メソッドに渡す形になります.
15
+ この run() とは Handler で実行したい処理のことでしょうか. でしたら, Runnable を実装したクラスの中に書かなければなりません. そのクラスのインスタンスを Handler の post メソッドに渡す形になります.
16
16
 
17
17
  サブスレッドで…というのは意味が分かりません.
18
18
 
@@ -26,7 +26,7 @@
26
26
 
27
27
 
28
28
 
29
- > そのrun()に到達すると、メインスレッドのHandlerに渡ってrun()の中に書いてあったことが実行される…?
29
+ > そのrun()に到達すると、メインスレッドの Handler に渡ってrun()の中に書いてあったことが実行される…?
30
30
 
31
31
 
32
32