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

回答編集履歴

5

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

2017/12/12 07:31

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -76,6 +76,7 @@
76
76
 
77
77
  @Override
78
78
  public void onResume() {
79
+ super.onResume(); //(※) 最初これを入れ忘れてました。スミマセン
79
80
  app = new MyApplication();
80
81
  app.start();
81
82
  }
@@ -84,6 +85,8 @@
84
85
  public void onPause() {
85
86
  app.stop();
86
87
  app = null;
88
+ super.onPause(); //(※) 最初これを入れ忘れてました。スミマセン
87
89
  }
88
90
  }
89
- ```
91
+ ```
92
+ 最初のコードはonResume/onPauseでsuperを呼び出してませんでした。これではダメですね。不足していた行(※)を追記しました。

4

訂正1

2017/12/12 07:31

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

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

3

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

2017/12/12 06:24

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -64,6 +64,11 @@
64
64
  public class MainActivity extends AppCompatActivity {
65
65
  MyApplication app;
66
66
 
67
+ // ボタンかなにかのハンドラーだと思ってください
68
+ // こういうふうに書けばMyApplicationインスタンスのxが参照できます
69
+ void onClick() {
70
+ Log.d("debug", "x=" + app.x);
71
+ }
67
72
  ...
68
73
 
69
74
  @Override

2

追記

2017/12/12 05:55

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -1,4 +1,4 @@
1
- 訂正:すみません!AndroidのContext機構のことをおっしゃっていたのですね。
1
+ 訂正1:すみません!AndroidのContext機構のことをおっしゃっていたのですね。
2
2
  以下の回答は全然勘違いしていたものです。大変失礼しました。
3
3
 
4
4
  ---
@@ -22,4 +22,60 @@
22
22
  ```
23
23
 
24
24
 
25
- コンテキストをfunctional interfaceのような形で渡すことでも実現できますが結局のところどこかでMyApplicationのインスタンスは生成しなければなりません。ご質問はどのようにアクセスしたいか、なぜコンテキストであってほしいかが曖昧な気がします。
25
+ コンテキストをfunctional interfaceのような形で渡すことでも実現できますが結局のところどこかでMyApplicationのインスタンスは生成しなければなりません。ご質問はどのようにアクセスしたいか、なぜコンテキストであってほしいかが曖昧な気がします。
26
+
27
+ ---
28
+ 追記2:
29
+
30
+ AndroidのContextの使い方という話題とは離れた話になりますが、2つのインスタンス間の連携についてのみコメントします。なお、自分はAndroidでのベストな方法が何か詳しくないのでJavaとしての「あり得る方法」を書くことしかできません。その点ご容赦ください。
31
+
32
+ ご質問のMyApplicationですがtestが呼ばれていないためxが変化しないのだと思います。しかしtestは単純な無限ループとなっておりこのままではまずいので、例えば次のように「別のスレッドで控えめに無限ループ」するような配慮が必要と思います。(本当は下記のMyApplicationのメソッドstart/stopではなくApplicationクラスの派生クラスとして定義しそれのライフサイクルルールに従って書くべきではないかと思います。)
33
+
34
+
35
+ ```java
36
+ public class MyApplication implements Runnable {
37
+ public int x = 0;
38
+ Thread thread;
39
+
40
+ public void start() {
41
+ thread = new Thread(this);
42
+ thread.setDaemon(true);
43
+ thread.start();
44
+ }
45
+
46
+ public void stop() {
47
+ thread.interrupt();
48
+ thread = null;
49
+ }
50
+
51
+ @Override
52
+ public void run() {
53
+ try {
54
+ for (;;) {
55
+ Thread.sleep(100);
56
+ x++;
57
+ }
58
+ } catch (InterruptedException e) {
59
+ }
60
+ }
61
+ }
62
+
63
+ // 別のソースファイル
64
+ public class MainActivity extends AppCompatActivity {
65
+ MyApplication app;
66
+
67
+ ...
68
+
69
+ @Override
70
+ public void onResume() {
71
+ app = new MyApplication();
72
+ app.start();
73
+ }
74
+
75
+ @Override
76
+ public void onPause() {
77
+ app.stop();
78
+ app = null;
79
+ }
80
+ }
81
+ ```

1

訂正

2017/12/12 05:52

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

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