구현할 내용
- Storage에 파일이 생길 때까지 요청 반복하기 (pooling)
- 모델이 결과를 내놓을 때까지 기다리고, 받아오기 위함
- Storage에 (json)파일이 있을 경우 정보를 얻어오기
pooling하는 이유 ::
5. 로컬 서버와 통신하기
6. Azure 서버와 통신하기
여기에서 덧붙임 + 수정한 코드
public static void send2Server(File file){
// ...
// 앞부분은 azure 서버 통신 코드와 동일
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String test = response.body().string();
Log.d("TEST : ", test);
new CallFunctionTask().execute();
}
});
}
private static class CallFunctionTask extends AsyncTask<Void, Void, String> {
@Override
protected String doInBackground(Void... voids) {
try {
URL url = new URL("통신할 azure funtion app의 URL 주소");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
connection.connect();
int responseCode = connection.getResponseCode();
if (responseCode == 200) {
InputStream inputStream = connection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder result = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
result.append(line);
}
return result.toString();
} else {
// funtion app에서 해당 파일이 없다는 결과를 내면 (200 응답을 못 받으면)
// 5초 뒤에 다시 통신 시도
Log.e("Response code", "Response code: " + responseCode);
Thread.sleep(5000);
return null;
}
} catch (Exception e) {
Log.e("Error message", e.getMessage(), e);
return null;
}
}
private static class CallFunctionTask extends AsyncTask<Void, Void, String> {
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
Log.d("TEST : ", result);
if (result == null) {
// retry
new CallFunctionTask().execute();
} else {
try {
JSONObject resultjson = new JSONObject(result);
File filesDir = MyApplication.getAppContext().getFilesDir();
File file = new File(filesDir, "data.json");
if (file.exists()) {
// 파일이 존재하는 경우
FileInputStream inputStream = MyApplication.getAppContext().openFileInput("data.json");
byte[] bytes = new byte[inputStream.available()];
inputStream.read(bytes);
inputStream.close();
String jsonString = new String(bytes);
JSONArray myJsonArray = new JSONArray(jsonString);
myJsonArray.put(resultjson);
FileOutputStream outputStream = MyApplication.getAppContext().openFileOutput("data.json", Context.MODE_PRIVATE);
outputStream.write(myJsonArray.toString().getBytes());
outputStream.close();
} else {
// 파일이 존재하지 않는 경우
JSONArray myJsonArray = new JSONArray();
myJsonArray.put(resultjson);
FileOutputStream outputStream = MyApplication.getAppContext().openFileOutput("data.json", Context.MODE_PRIVATE);
outputStream.write(myJsonArray.toString().getBytes());
outputStream.close();
}
} catch (Exception e) {
Log.e("error json", e.getMessage(), e);
}
}
}