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

回答編集履歴

2

コード等を追加

2019/03/04 16:29

投稿

jimbe
jimbe

スコア13357

answer CHANGED
@@ -20,4 +20,143 @@
20
20
 
21
21
  どのスレッドのことでしょうか.
22
22
  メインスレッドは常に使われております.
23
- OkHttp は, おそらく call.enqueue によってスレッドが使用されていると思います.
23
+ OkHttp は, おそらく call.enqueue によってスレッドが使用されていると思います.
24
+
25
+ ---
26
+
27
+ かなり豪快なコードになっていると思います.
28
+
29
+ > //この1行を追加しました。
30
+ > new MainActivity().CompAnswer(Looper.getMainLooper(),response.body().string());
31
+
32
+ Activity は Android システムが管理していますので, 勝手に生成しても Activity としては機能いたしません. ですので findViewById が null を返しているのではないでしょうか.
33
+ 必要であれば okhttp3Client のパラメータとして受け取って使用してください.
34
+
35
+ また逆に CompAnswer は Looper をパラメータとして受け取って Handler を生成していますが, CompAnswer は MainActivity のメソッドですので, MainActivity で先に生成済みの ```Handler handler = new Handler();``` の handler が使用できると思います.
36
+
37
+
38
+ コード量と動作を考えますと, HttpClient クラスがあることによって動作イメージが崩れているのではないでしょうか. クラス分けは大事ですが, この場合 Http の処理は OkHttp が行っていますので, いっそ HttpClient クラスは無いほうが良いと思います.
39
+ (ついでですが, 各ボタンのリスナを全て同じにした上でリスナ内でボタンにより分岐するのでは無く, 専用処理があるボタンには専用リスナを設定したほうが分かり易いと思います.)
40
+
41
+ ```java
42
+ package com.example.hogehoge.calculater;
43
+
44
+ import android.os.Bundle;
45
+ import android.os.Handler;
46
+ import android.support.v7.app.AppCompatActivity;
47
+ import android.view.View;
48
+ import android.widget.Button;
49
+ import android.widget.TextView;
50
+
51
+ import java.io.IOException;
52
+
53
+ import okhttp3.*;
54
+
55
+ public class MainActivity extends AppCompatActivity {
56
+
57
+ TextView formulaTextView;
58
+ Handler handler = new Handler();
59
+
60
+ @Override
61
+ protected void onCreate(Bundle savedInstanceState) {
62
+ super.onCreate(savedInstanceState);
63
+ setContentView(R.layout.activity_main);
64
+
65
+ formulaTextView = (TextView) findViewById(R.id.formula);
66
+
67
+ View.OnClickListener NumListener = new View.OnClickListener() {
68
+ @Override
69
+ public void onClick(View view) {
70
+ formulaTextView.append(((Button)view).getText());
71
+ }
72
+ };
73
+
74
+ findViewById(R.id.num1).setOnClickListener(NumListener);
75
+ findViewById(R.id.num2).setOnClickListener(NumListener);
76
+ findViewById(R.id.num3).setOnClickListener(NumListener);
77
+ findViewById(R.id.num4).setOnClickListener(NumListener);
78
+ findViewById(R.id.num5).setOnClickListener(NumListener);
79
+ findViewById(R.id.num6).setOnClickListener(NumListener);
80
+ findViewById(R.id.num7).setOnClickListener(NumListener);
81
+ findViewById(R.id.num8).setOnClickListener(NumListener);
82
+ findViewById(R.id.num9).setOnClickListener(NumListener);
83
+ findViewById(R.id.num0).setOnClickListener(NumListener);
84
+
85
+ findViewById(R.id.coron).setOnClickListener(NumListener);
86
+
87
+ findViewById(R.id.add).setOnClickListener(NumListener);
88
+ findViewById(R.id.substract).setOnClickListener(NumListener);
89
+ findViewById(R.id.divide).setOnClickListener(NumListener);
90
+ findViewById(R.id.multiply).setOnClickListener(NumListener);
91
+
92
+ findViewById(R.id.NEXT_INT).setOnClickListener(new View.OnClickListener() {
93
+ @Override
94
+ public void onClick(View view) {
95
+ formulaTextView.append(" ");
96
+ }
97
+ });
98
+ findViewById(R.id.Clear).setOnClickListener(new View.OnClickListener() {
99
+ @Override
100
+ public void onClick(View view) {
101
+ formulaTextView.setText("");
102
+ }
103
+ });
104
+ findViewById(R.id.equal).setOnClickListener(new View.OnClickListener() {
105
+ @Override
106
+ public void onClick(View view) {
107
+ okhttp3Client(formulaTextView.getText().toString());
108
+ }
109
+ });
110
+ findViewById(R.id.BACK).setOnClickListener(new View.OnClickListener() {
111
+ @Override
112
+ public void onClick(View view) {
113
+ Button button = (Button) view;
114
+ if (formulaTextView.length() > 0 && formulaTextView.getText() != null) {
115
+ String temp = formulaTextView.getText().toString();
116
+ temp = temp.substring(0, temp.length() - 1);
117
+ formulaTextView.setText(temp);
118
+ }
119
+ }
120
+ });
121
+ }
122
+
123
+ void okhttp3Client(final String formula) {
124
+ String url = "http://hogehoge.site";
125
+ OkHttpClient client = new OkHttpClient();
126
+
127
+ try {
128
+ Request request = new Request.Builder()
129
+ .url(url)
130
+ .post(RequestBody.create(MediaType.parse("text/plain;charset=utf-8"), formula))
131
+ .build();
132
+ Call call = client.newCall(request);
133
+ call.enqueue(new Callback() {
134
+ @Override
135
+ public void onFailure(Call call, IOException e) {
136
+ //エラー処理を書く
137
+ }
138
+ @Override
139
+ public void onResponse(Call call, Response response) throws IOException {
140
+ //この1行を追加しました。
141
+ compAnswer(response.body().string());
142
+ }
143
+ });
144
+ } catch(Exception e) {
145
+
146
+ }
147
+ }
148
+
149
+ //以下のメソッドを新しく追加しました。
150
+ private void compAnswer(final String Answer) {
151
+ handler.post(new Runnable() {
152
+ @Override
153
+ public void run() {
154
+
155
+ //このテキストビューまでは到達できました。
156
+ //実行しようとするとアプリ自体が落ちることは確認できました。
157
+ formulaTextView.setText(Answer);
158
+ }
159
+ });
160
+ }
161
+ }
162
+ ```

1

記述間違い

2019/03/04 16:29

投稿

jimbe
jimbe

スコア13357

answer CHANGED
@@ -5,14 +5,14 @@
5
5
 
6
6
  > サブスレッドでvoid run()をどこでもいいから書かないといけない?
7
7
 
8
- この run() とは Handler で実行したい処理のことでしょうか. でしたら, Runnable を実装したクラスの中に書かなければなりません. そのクラスのインスタンスを Thread の post メソッドに渡す形になります.
8
+ この run() とは Handler で実行したい処理のことでしょうか. でしたら, Runnable を実装したクラスの中に書かなければなりません. そのクラスのインスタンスを Handler の post メソッドに渡す形になります.
9
9
  サブスレッドで…というのは意味が分かりません.
10
10
 
11
11
  > サブスレッドでHandlerは書かなくて良い
12
12
 
13
13
  上で言われている宣言のことでしょうか. 2つは要らないと思います.
14
14
 
15
- > そのrun()に到達すると、メインスレッドのHandlerに渡ってrun()の中に書いてあったことが実行される…?
15
+ > そのrun()に到達すると、メインスレッドの Handler に渡ってrun()の中に書いてあったことが実行される…?
16
16
 
17
17
  逆と思います. Handler の post メソッドに Runnable を実装し( run() に必要な処理を書い) たクラスのインスタンスを渡しますと, UIスレッドにて run() が実行されます.
18
18