回答編集履歴

5

superのメソッドを呼ぶように変更

2017/12/12 07:31

投稿

KSwordOfHaste
KSwordOfHaste

スコア18392

test CHANGED
@@ -154,6 +154,8 @@
154
154
 
155
155
  public void onResume() {
156
156
 
157
+ super.onResume(); //(※) 最初これを入れ忘れてました。スミマセン
158
+
157
159
  app = new MyApplication();
158
160
 
159
161
  app.start();
@@ -170,8 +172,12 @@
170
172
 
171
173
  app = null;
172
174
 
175
+ super.onPause(); //(※) 最初これを入れ忘れてました。スミマセン
176
+
173
177
  }
174
178
 
175
179
  }
176
180
 
177
181
  ```
182
+
183
+ 最初のコードはonResume/onPauseでsuperを呼び出してませんでした。これではダメですね。不足していた行(※)を追記しました。

4

訂正1

2017/12/12 07:31

投稿

KSwordOfHaste
KSwordOfHaste

スコア18392

test CHANGED
@@ -1,6 +1,12 @@
1
+ 訂正1:
2
+
1
- 訂正1:すみません!AndroidのContext機構のことをおっしゃっていたのですね。
3
+ すみません!AndroidのContext機構のことをおっしゃっていたのですね。
2
4
 
3
5
  以下の回答は全然勘違いしていたものです。大変失礼しました。
6
+
7
+ =>**回答コメントにてAndroidのContext機構に関係ない話であることに気づきました。
8
+
9
+ あわてんぼうですみません。**
4
10
 
5
11
 
6
12
 

3

Activityのコードをちょっと追加

2017/12/12 06:24

投稿

KSwordOfHaste
KSwordOfHaste

スコア18392

test CHANGED
@@ -130,6 +130,16 @@
130
130
 
131
131
 
132
132
 
133
+ // ボタンかなにかのハンドラーだと思ってください
134
+
135
+ // こういうふうに書けばMyApplicationインスタンスのxが参照できます
136
+
137
+ void onClick() {
138
+
139
+ Log.d("debug", "x=" + app.x);
140
+
141
+ }
142
+
133
143
  ...
134
144
 
135
145
 

2

追記

2017/12/12 05:55

投稿

KSwordOfHaste
KSwordOfHaste

スコア18392

test CHANGED
@@ -1,4 +1,4 @@
1
- 訂正:すみません!AndroidのContext機構のことをおっしゃっていたのですね。
1
+ 訂正1:すみません!AndroidのContext機構のことをおっしゃっていたのですね。
2
2
 
3
3
  以下の回答は全然勘違いしていたものです。大変失礼しました。
4
4
 
@@ -47,3 +47,115 @@
47
47
 
48
48
 
49
49
  コンテキストをfunctional interfaceのような形で渡すことでも実現できますが結局のところどこかでMyApplicationのインスタンスは生成しなければなりません。ご質問はどのようにアクセスしたいか、なぜコンテキストであってほしいかが曖昧な気がします。
50
+
51
+
52
+
53
+ ---
54
+
55
+ 追記2:
56
+
57
+
58
+
59
+ AndroidのContextの使い方という話題とは離れた話になりますが、2つのインスタンス間の連携についてのみコメントします。なお、自分はAndroidでのベストな方法が何か詳しくないのでJavaとしての「あり得る方法」を書くことしかできません。その点ご容赦ください。
60
+
61
+
62
+
63
+ ご質問のMyApplicationですがtestが呼ばれていないためxが変化しないのだと思います。しかしtestは単純な無限ループとなっておりこのままではまずいので、例えば次のように「別のスレッドで控えめに無限ループ」するような配慮が必要と思います。(本当は下記のMyApplicationのメソッドstart/stopではなくApplicationクラスの派生クラスとして定義しそれのライフサイクルルールに従って書くべきではないかと思います。)
64
+
65
+
66
+
67
+
68
+
69
+ ```java
70
+
71
+ public class MyApplication implements Runnable {
72
+
73
+ public int x = 0;
74
+
75
+ Thread thread;
76
+
77
+
78
+
79
+ public void start() {
80
+
81
+ thread = new Thread(this);
82
+
83
+ thread.setDaemon(true);
84
+
85
+ thread.start();
86
+
87
+ }
88
+
89
+
90
+
91
+ public void stop() {
92
+
93
+ thread.interrupt();
94
+
95
+ thread = null;
96
+
97
+ }
98
+
99
+
100
+
101
+ @Override
102
+
103
+ public void run() {
104
+
105
+ try {
106
+
107
+ for (;;) {
108
+
109
+ Thread.sleep(100);
110
+
111
+ x++;
112
+
113
+ }
114
+
115
+ } catch (InterruptedException e) {
116
+
117
+ }
118
+
119
+ }
120
+
121
+ }
122
+
123
+
124
+
125
+ // 別のソースファイル
126
+
127
+ public class MainActivity extends AppCompatActivity {
128
+
129
+ MyApplication app;
130
+
131
+
132
+
133
+ ...
134
+
135
+
136
+
137
+ @Override
138
+
139
+ public void onResume() {
140
+
141
+ app = new MyApplication();
142
+
143
+ app.start();
144
+
145
+ }
146
+
147
+
148
+
149
+ @Override
150
+
151
+ public void onPause() {
152
+
153
+ app.stop();
154
+
155
+ app = null;
156
+
157
+ }
158
+
159
+ }
160
+
161
+ ```

1

訂正

2017/12/12 05:52

投稿

KSwordOfHaste
KSwordOfHaste

スコア18392

test CHANGED
@@ -1,3 +1,11 @@
1
+ 訂正:すみません!AndroidのContext機構のことをおっしゃっていたのですね。
2
+
3
+ 以下の回答は全然勘違いしていたものです。大変失礼しました。
4
+
5
+
6
+
7
+ ---
8
+
1
9
  コンテキストを渡さずとも普通にインスタンスを渡せばそれを介してpublicメンバーにアクセスできますよ。それが素朴でシンプルな方法だと思います。(A)
2
10
 
3
11