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

回答編集履歴

1

Threadの実装の仕方について一例として

2020/10/13 14:33

投稿

keicha_hrs
keicha_hrs

スコア6768

answer CHANGED
@@ -1,3 +1,52 @@
1
1
  LINE notifyについては全く知見がないのでその内容については何も言えませんが、プログラムの作り方については大いに問題があります。Android SDKを用いて作成するAndroidアプリケーションのプログラミングでは、通常のJavaプログラムと異なり`public static void main()`から始まるプログラムを作ることはできません。SDKの作法に則ったプログラムの作り方に改修する必要があります。
2
2
 
3
- また、やはりAndroidアプリケーション開発の縛りとして、UIを操作するスレッド(メインとなるスレッド)でネットワーク通信をすることもできません。`Thread`などを用いてネットワーク通信するための別スレッドで処理する必要があります。なお、Andoroidアプリのプログラミングで別スレッド処理の方法を調べると`AsyncTask`というクラスを用いる方法が多数ヒットすると思いますが、このクラスはAPIレベル30で非推奨となったため、別の手段を用いるべきです。
3
+ また、やはりAndroidアプリケーション開発の縛りとして、UIを操作するスレッド(メインとなるスレッド)でネットワーク通信をすることもできません。`Thread`などを用いてネットワーク通信するための別スレッドで処理する必要があります。なお、Andoroidアプリのプログラミングで別スレッド処理の方法を調べると`AsyncTask`というクラスを用いる方法が多数ヒットすると思いますが、このクラスはAPIレベル30で非推奨となったため、別の手段を用いるべきです。
4
+
5
+ ---
6
+
7
+ > 別スレッドで処理するThreadのコード自体はどこに記載すればよいのでしょうか?
8
+
9
+ 設計次第ではありますが、LineNotifyクラスの中に記述すればいいのではないでしょうか。
10
+
11
+ 一例として
12
+
13
+ ```java
14
+ class LineNotify {
15
+ private static final String token = "****ここにアクセストークンを入れる****";
16
+
17
+ public void notify(String message) {
18
+ Comm t = new Comm(message);
19
+ t.start();
20
+ }
21
+
22
+ static class Comm extends Thread {
23
+ private String message;
24
+
25
+ Comm(String message) {
26
+ this.message = message;
27
+ }
28
+
29
+ @Override
30
+ public void run() {
31
+ // 現状のNotify()メソッドにあるネットワーク通信の処理をここに記述
32
+ }
33
+ }
34
+
35
+ (以下略)
36
+
37
+ }
38
+ ```
39
+
40
+ 呼び出すMainActivity.javaの側では
41
+
42
+ ```java
43
+ button.setOnClickListener(new View.OnClickListener() {
44
+ @Override
45
+ public void onClick(View v) {
46
+ classln.notify("lineテスト");
47
+ classln.notify("Test signal");
48
+ }
49
+ });
50
+ ```
51
+
52
+ のようにnotify()の引数に送りたい文字列をセットすればいけるのではないかと。