回答編集履歴

1

AsyncTask を利用するコードを追加

2023/01/16 10:21

投稿

jimbe
jimbe

スコア12639

test CHANGED
@@ -138,3 +138,70 @@
138
138
  android:enabled="true"
139
139
  android:exported="true" />
140
140
  ```
141
+ ---
142
+ AsyncTask.doInBackGround からのデータを用いる方法として、AsyncTask を内部クラスにして onPostExecute で外部クラスのメソッドを呼ぶ際のパラメータとすることも可能です。
143
+ 以下は CLOUDS ボタンを押したときは WeatherAsyncTask を起動し、 doInBackground の返り値を startSoundService のパラメータにしています。
144
+
145
+ ```java
146
+ import android.content.Intent;
147
+ import android.os.*;
148
+ import android.util.Log;
149
+ import android.widget.Button;
150
+
151
+ import androidx.appcompat.app.AppCompatActivity;
152
+
153
+ import java.net.*;
154
+
155
+ public class MainActivity extends AppCompatActivity {
156
+ private static final String LOG_TAG = MainActivity.class.getSimpleName();
157
+
158
+ @Override
159
+ protected void onCreate(Bundle savedInstanceState) {
160
+ super.onCreate(savedInstanceState);
161
+ setContentView(R.layout.activity_main);
162
+
163
+ Button clearButton = findViewById(R.id.clearButton);
164
+ clearButton.setOnClickListener(v -> {
165
+ startSoundService("Clear");
166
+ });
167
+
168
+ Button cloudsButton = findViewById(R.id.cloudsButton);
169
+ cloudsButton.setOnClickListener(v -> {
170
+ try {
171
+ new WeatherAsyncTask().execute(new URL("http://~"));
172
+ } catch(MalformedURLException e) {
173
+ e.printStackTrace();
174
+ }
175
+ });
176
+
177
+ Button stopButton = findViewById(R.id.stopButton);
178
+ stopButton.setOnClickListener(v -> stopService(new Intent(this, SoundService.class)));
179
+ }
180
+
181
+ private void startSoundService(String result) {
182
+ Intent intent = new Intent(this, SoundService.class);
183
+ intent.putExtra(SoundService.EXTRA_RESULT, result);
184
+ startService(intent);
185
+ }
186
+
187
+ class WeatherAsyncTask extends AsyncTask<URL, Void, String> {
188
+ private final String LOG_TAG = WeatherAsyncTask.class.getSimpleName();
189
+
190
+ @Override
191
+ protected String doInBackground(URL... urls) {
192
+ Log.d(LOG_TAG, "doInBackground("+urls[0]+")");
193
+
194
+ // URL にアクセスしてなんやかんや処理して resault が得た風
195
+ String result = "Clouds";
196
+
197
+ return result;
198
+ }
199
+
200
+ @Override
201
+ protected void onPostExecute(String result) {
202
+ Log.d(LOG_TAG, "onPostExecute("+result+")");
203
+ startSoundService(result);
204
+ }
205
+ }
206
+ }
207
+ ```