お世話になります。
色々と試行錯誤してみましたが、Log.d("urlB",urlB)の時点で想定のURLが取得できていません。
お手数ですが、ご教示のほどよろしくお願い致します。
※追記
実現方法としては、AsyncTaskを継承したクラスファイルをAPIの処理毎に用意(3つ)して、
外部API(1)処理のcreateListener1()のonSuccess()内で、
外部API(2)処理のcreateListener2()を呼び出し、
createListener2()のonSuccess()内でcreateListener3()を呼び出す形となりますでしょうか。
開発素人のため、そもそも誤っていたら指摘ください。
実現したいこと
- ボタンをクリック
- EditTextに入力された内容をもとにURLを作成
- 外部API(1)に接続してXMLを取得
- 取得したXMLを解析し、それをもとにURLを作成
- 外部API(2)に接続してXMLを取得
- 取得したXMLを解析し、それをもとにURLを作成
- 外部API(3)に接続してXMLを取得
- 取得した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 }