質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

1回答

2062閲覧

Android:1回の処理内で連続でAPI接続を行う

noname1234

総合スコア6

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2020/02/13 08:50

編集2020/02/13 12:45

お世話になります。

色々と試行錯誤してみましたが、Log.d("urlB",urlB)の時点で想定のURLが取得できていません。
お手数ですが、ご教示のほどよろしくお願い致します。

※追記
実現方法としては、AsyncTaskを継承したクラスファイルをAPIの処理毎に用意(3つ)して、
外部API(1)処理のcreateListener1()のonSuccess()内で、
外部API(2)処理のcreateListener2()を呼び出し、
createListener2()のonSuccess()内でcreateListener3()を呼び出す形となりますでしょうか。
開発素人のため、そもそも誤っていたら指摘ください。

実現したいこと

  1. ボタンをクリック
  2. EditTextに入力された内容をもとにURLを作成
  3. 外部API(1)に接続してXMLを取得
  4. 取得したXMLを解析し、それをもとにURLを作成
  5. 外部API(2)に接続してXMLを取得
  6. 取得したXMLを解析し、それをもとにURLを作成
  7. 外部API(3)に接続してXMLを取得
  8. 取得したXMLを解析

ソースコード

MainActivity

1public void onClick(View view) { 2 final EditText aaa = findViewById(R.id.aaa); 3 final EditText bbb = findViewById(R.id.bbb); 4 5 String testA = aaa.getText().toString(); 6 String testB = bbb.getText().toString(); 7 8 String urlA = TO_API1 + "request_data1=“" + aaa + "&request_data2=" + bbb; 9 10 Log.d("urlA",urlA); 11 12 getAsyncTask = new GetAsyncTask(this); 13 getAsyncTask.setListener(createListener1()); 14 getAsyncTask.execute(urlA); 15 16 String urlB = TO_API2 + "api_id=" + API_ID + str1 + str2 + "&lang=" + LANG; 17 18 Log.d("urlB",urlB); 19 20 getAsyncTask = new GetAsyncTask(this); 21 getAsyncTask.setListener(createListener2()); 22 getAsyncTask.execute(urlB); 23 24 String urlC = TO_API3 + "request_data1=“" + str1 + "&request_data2=" + str2; 25 26 Log.d("urlC",urlC); 27 28 getAsyncTask = new GetAsyncTask(this); 29 getAsyncTask.setListener(createListener3()); 30 getAsyncTask.execute(urlC); 31 } 32 private GetAsyncTask.Listener createListener1() { 33 return new GetAsyncTask.Listener() { 34 @Override 35 public void onSuccess(InputStream xml) { 36 try { 37 getXMLContents(xml); 38 testA = responseData1; 39 testB = responseData2; 40 } catch (Exception e) { 41 e.printStackTrace(); 42 } 43 } 44 }; 45 } 46 private GetAsyncTask.Listener createListener2() { 47 return new GetAsyncTask.Listener() { 48 @Override 49 public void onSuccess(InputStream xml) { 50 try { 51 getXMLContents(xml); 52 } catch (Exception e) { 53 e.printStackTrace(); 54 } 55 } 56 }; 57 } 58 private GetAsyncTask.Listener createListener3() { 59 return new GetAsyncTask.Listener() { 60 @Override 61 public void onSuccess(InputStream xml) { 62 try { 63 getXMLContents(xml); 64 str1 = responseData1; 65 str2 = responseData2; 66 saveSharedPreferences(); 67 } catch (Exception e) { 68 e.printStackTrace(); 69 } 70 } 71 }; 72 } 73 74 public void getXMLContents(InputStream is) throws Exception{ 75 try{ 76 Document document= DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(is); 77 78 Element rootElement=document.getDocumentElement(); 79 NodeList nodeListData1 = rootElement.getElementsByTagName("data1"); 80 NodeList nodeListData2 = rootElement.getElementsByTagName("data2"); 81 82 for (int i = 0; i < nodeListData1.getLength(); i++) { 83 Element elem = (Element) nodeListData1.item(i); 84 responseData1 = elem.getAttribute("response_data1"); 85 } 86 for (int i = 0; i < nodeListData2.getLength(); i++) { 87 Element elem = (Element) nodeListData2.item(i); 88 responseData2 = elem.getAttribute("response_data2"); 89 } 90 91 }catch(Exception e){ 92 throw e; 93 } 94 }

GetAsyncTask

1public class GetAsyncTask extends AsyncTask<Object, Void, Object> { 2 private Context context; 3 private final WeakReference<Activity> w_Activity; 4 private Listener listener; 5 6 GetAsyncTask(Activity activity) { 7 this.w_Activity = new WeakReference<>(activity); 8 } 9 10 @Override 11 protected Object doInBackground(Object[] data) { 12 13 String url = (String)data[0]; 14 15 OkHttpClient client = new OkHttpClient(); 16 17 Request request = new Request.Builder().url(url).get().build(); 18 19 Call call = client.newCall(request); 20 String result = ""; 21 22 try { 23 Response response = call.execute(); 24 ResponseBody body = response.body(); 25 if (body != null) { 26 result = body.string(); 27 } 28 } catch (IOException e) { 29 e.printStackTrace(); 30 } 31 return result; 32 }

MainActivity修正

1private GetAsyncTask.Listener createListener1() { 2 return new GetAsyncTask.Listener() { 3 @Override 4 public void onSuccess(InputStream xml) { 5 try { 6 getXMLContents(xml); 7 testA = responseData1; 8 testB = responseData2; 9 10            String urlB = TO_API2 + "api_id=" + API_ID + str1 + str2 + "&lang=" + LANG; 11            getAsyncTask = new GetAsyncTask(MainActivity.this); 12        getAsyncTask.setListener(createListener2()); 13        getAsyncTask.execute(urlB); 14 } catch (Exception e) { 15 e.printStackTrace(); 16 } 17 } 18 }; 19 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2020/02/13 09:00

onClick で実行した非同期処理の結果が返ってくるのは onClick メソッドを抜けた後になります。このため、onClick で 3 つの非同期処理を開始するとそれらは並行して走ることになります。API1 の結果を API2 で利用するには、API1 の結果が返ってきてから(つまり、createListener1 の onSuccess の中で)API2 を開始する必要があります。
noname1234

2020/02/13 09:34

ご回答頂きありがとうございます。ソースコード修正版を記載しました。 記載の内容で問題ないでしょうか。
hoshi-takanori

2020/02/13 16:05

onClick では getAsyncTask.execute(urlA); とその準備だけを行い、createListener1 の onSuccess で getAsyncTask.execute(urlB);、createListener2 の onSuccess で getAsyncTask.execute(urlC); とする必要があると思います。
jimbe

2020/02/13 17:22

ご提示のコードはちゃんと動作しているモノから得られた部分なのでしょうか. >String testA = aaa.getText().toString(); >String testB = bbb.getText().toString(); >String urlA = TO_API1 + "request_data1=“" + aaa + "&request_data2=" + bbb; の個所だけでもおかしな状態なのですが.
guest

回答1

0

動かして確認してはいませんが, 例えば Future.get() が (Callable が値を返すまで) 待機することを利用して以下のようにすると, 順番にやっているように書けて良いのではと思います.

java

1 @Override 2 public void onClick(View v) { 3 EditText aaa = findViewById(R.id.aaa); 4 String testA = aaa.getText().toString(); 5 6 EditText bbb = findViewById(R.id.bbb); 7 String testB = bbb.getText().toString(); 8 9 Thread thread = new Thread(new Runnable() { 10 @Override 11 public void run() { 12 ExecutorService es = Executors.newSingleThreadExecutor(); 13 try { 14 //入力値を使ってアクセスを行う 15 String urlA = TO_API1 + "request_data1=" + testA + "&request_data2=" + testB; 16 Future<ResponseA> futureA = es.submit(new XMLAcquirer(urlA, root -> new ResponseA(root))); 17 ResponseA resA = futureA.get(); 18 19 //resA のデータを使って次のアクセスを行う 20 String urlB = TO_API2 + "api_id=" + API_ID + resA.api_id1 + resA.api_id2 + "&lang=" + LANG; 21 Future<ResponseB> futureB = es.submit(new XMLAcquirer(urlB, root -> new ResponseB(root))); 22 ResponseB resB = futureB.get(); 23 24 //さらに resB のデータを使って次のアクセスを行う 25 String urlC = TO_API3 + "request_data1=" + resB.data1 + "&request_data2=" + resB.data2; 26 Future<ResponseC> futureC = es.submit(new XMLAcquirer(urlC, root -> new ResponseC(root))); 27 ResponseC resC = futureC.get(); 28 29 // resC のデータを保存する? 30 saveSharedPreferences(resC); 31 32 } catch(InterruptedException e) { 33 e.printStackTrace(); 34 } catch(ExecutionException e) { 35 e.printStackTrace(); 36 } 37 } 38 }); 39 thread.start(); 40 } 41 //urlA の XML を解析して必要なデータを内部に保持する 42 static class ResponseA { 43 ResponseA(Element rootElement) { 44 NodeList nodeListData1 = rootElement.getElementsByTagName("data1"); 45 for (int i = 0; i < nodeListData1.getLength(); i++) { 46 Element elem = (Element) nodeListData1.item(i); 47 api_id1 = elem.getAttribute("response_data1"); 48 } 49 NodeList nodeListData2 = rootElement.getElementsByTagName("data2"); 50 for (int i = 0; i < nodeListData2.getLength(); i++) { 51 Element elem = (Element) nodeListData2.item(i); 52 api_id2 = elem.getAttribute("response_data2"); 53 } 54 } 55 String api_id1; 56 String api_id2; 57 } 58 //urlB の XML を解析して必要なデータを内部に保持する 59 static class ResponseB { 60 ResponseB(Element rootElement) { 61 NodeList nodeListData1 = rootElement.getElementsByTagName("data1"); 62 for (int i = 0; i < nodeListData1.getLength(); i++) { 63 Element elem = (Element) nodeListData1.item(i); 64 data1 = elem.getAttribute("response_data1"); 65 } 66 NodeList nodeListData2 = rootElement.getElementsByTagName("data2"); 67 for (int i = 0; i < nodeListData2.getLength(); i++) { 68 Element elem = (Element) nodeListData2.item(i); 69 data2 = elem.getAttribute("response_data2"); 70 } 71 } 72 String data1; 73 String data2; 74 } 75 //urlC の XML を解析して必要なデータを内部に保持する 76 static class ResponseC { 77 ResponseC(Element rootElement) { 78 NodeList nodeListData1 = rootElement.getElementsByTagName("data1"); 79 for (int i = 0; i < nodeListData1.getLength(); i++) { 80 Element elem = (Element) nodeListData1.item(i); 81 data1 = elem.getAttribute("response_data1"); 82 } 83 NodeList nodeListData2 = rootElement.getElementsByTagName("data2"); 84 for (int i = 0; i < nodeListData2.getLength(); i++) { 85 Element elem = (Element) nodeListData2.item(i); 86 data2 = elem.getAttribute("response_data2"); 87 } 88 } 89 String data1; 90 String data2; 91 } 92 93 interface ResponseFactory<T> { 94 T createResponse(Element root); 95 } 96 static class XMLAcquirer<T> implements Callable<T> { 97 private String url; 98 private ResponseFactory<T> factory; 99 XMLAcquirer(String url, ResponseFactory<T> factory) { 100 this.url = url; 101 this.factory = factory; 102 } 103 @Override 104 public T call() throws Exception { 105 return parseHttpResponse(getHttpResponse(url)); 106 } 107 private InputStream getHttpResponse(String url) throws IOException { 108 OkHttpClient client = new OkHttpClient(); 109 Request request = new Request.Builder().url(url).get().build(); 110 ResponseBody body = client.newCall(request).execute().body(); 111 if(body == null) throw new IOException(url+" return Null."); 112 return body.byteStream(); 113 } 114 private T parseHttpResponse(InputStream is) throws Exception { 115 Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(is); 116 return factory.createResponse(document.getDocumentElement()); 117 } 118 }

投稿2020/02/14 07:52

編集2020/02/14 08:07
jimbe

総合スコア13209

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問