AsyncTask 를 Class 화하여 사용하는 방법이다.
private void getJSONFromAsyncHttpClient() { Uri.Builder builder = new Uri.Builder() .appendQueryParameter("uID", Value.encrypt(Value.getPhoneUID(context))) .appendQueryParameter("userID", Value.encrypt(userID)) .appendQueryParameter("searName", Value.encrypt(gubun)) .appendQueryParameter("searValue", Value.encrypt(tmpStr)) .appendQueryParameter("keyword", Value.encrypt(Value.URLkey())); String params = builder.build().getEncodedQuery();
AsyncHttpComm asyncHttpComm = new AsyncHttpComm(); try { String result = asyncHttpComm.execute(Value.IPADDRESS + "/SearchList.php", params).get(); showJSONList(result); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } |
위 코드를 보면 AsyncHttpComm Class를 호출하고 결과 문자열을 String result 로 받고 있다.
그리고 showJSONList(result) 에 결과를 넣어서 서버로 받은 메시지를 파싱하여 RecyclerView 에서 처리하면 된다.
그럼 이제 AsyncHttpComm Class 는 어떻게 되어 있는지 보자.
public class AsyncHttpComm extends AsyncTask<String, Void, String> {
@Override protected String doInBackground(String... params) { try { return PHPComm.getJson(params[0], params[1]); } catch (Exception e) { return new String("Exception: " + e.getMessage()); } } } |
String 변수를 받아서 백그라운드 처리하고, String 결과를 받고 있다.
또 메소드 처리되어 있는 PHPComm Class 는 어떻게 만들어져 있나 보자.
세션에 대한 내용이 적혀 있는데 별 의미가 없는 거 같다.
내가 아직 잘 몰라서 그런지 안드로이드와 PHP 간 통신하는데 있어서 세션값을 물고 다니면서 처리하는 방식으로 구현하지 않아도 통신하는데 전혀 문제가 되지 않는다.
스마트폰 고유장치 값, 키 값을 이용하여 PHP 에서 해킹시도 자체를 방지할 수 있다.
public class PHPComm extends Activity {
// serverURL : JSON 요청을 받는 서버의 URL // postParams : POST 방식으로 전달될 입력 데이터 // 반환 데이터 : 서버에서 전달된 JSON 데이터 public static String getJson(String serverUrl, String postParams) throws Exception {
BufferedReader bufferedReader = null; try { Thread.sleep(100); URL url = new URL(serverUrl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 세션 쿠키 전달 String cookieString = CookieManager.getInstance().getCookie(Value.IPADDRESS); StringBuilder sb = new StringBuilder();
if(conn != null){ // 연결되었으면 //add request header conn.setRequestMethod("POST"); conn.setRequestProperty("USER-AGENT", "Mozilla/5.0"); conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); conn.setRequestProperty("Accept-Language", "en-US,en;q=0.5"); if (cookieString != null) { conn.setRequestProperty("Cookie", cookieString); Log.e("PHP_getCookie", cookieString); } conn.setConnectTimeout(10000); conn.setReadTimeout(10000); conn.setUseCaches(false); conn.setDefaultUseCaches(false); conn.setDoOutput(true); // POST 로 데이터를 넘겨주겠다는 옵션 conn.setDoInput(true);
// Send post request DataOutputStream wr = new DataOutputStream(conn.getOutputStream()); wr.writeBytes(postParams); wr.flush(); wr.close();
int responseCode = conn.getResponseCode(); System.out.println("GET Response Code : " + responseCode); if(responseCode == HttpURLConnection.HTTP_OK){ // 연결 코드가 리턴되면 bufferedReader = new BufferedReader(new InputStreamReader(conn.getInputStream())); String json; while((json = bufferedReader.readLine())!= null){ sb.append(json + "\n"); } } bufferedReader.close(); } System.out.println("PHP Comm Out : " + sb.toString()); return sb.toString().trim(); // 수행이 끝나고 리턴하는 값은 다음에 수행될 onProgressUpdate 의 파라미터가 된다 } catch(Exception e){ return new String("Exception: " + e.getMessage()); } } } |
이 두개의 Class 를 만들고 나면 Library 를 사용하는 것만큼 편하게 Text 데이터를 수신하여 파싱하고 결과처리를 쉽게 할 수 있다.
http://www.masterqna.com/android/29387/asynctask-%EC%9D%98-get-%EB%A9%94%EC%86%8C%EB%93%9C-%EC%A7%88%EB%AC%B8
에 나온 내용을 보니
AsyncTask.get()은 UI thread를 block 한다고
AsyncTaks안에 onPostExecute()를 implement하고 Handle 하라고 나온다.
시간이 오래 걸리는 작업은 AsyncTask.get()을 사용하지 말자.
이런거 귀찮다?????
좀 더 간편하게 라이브러리 이용하여 하고 싶다면
앱 build.gradle 에 아래 라이브러리를 추가한다.
dependencies {
implementation 'com.loopj.android:android-async-http:1.4.9'
}
코드는 아래와 같이 심플하다.
private void getJSONFromAsyncHttpClient() { RequestParams params = new RequestParams(); params.put("keyword", Value.encrypt(Value.URLkey())); params.put("uID", Value.encrypt(Value.getPhoneUID(context))); params.put("userID", Value.encrypt(userID)); params.put("searName", Value.encrypt(gubun)); params.put("searValue", Value.encrypt(tmpStr));
AsyncHttpClient client = new AsyncHttpClient(); client.post(Value.IPADDRESS + "/SearchList.php", params, new TextHttpResponseHandler() { @Override public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) { System.out.println("statusCode : " + statusCode); Toast.makeText(Search.this, "서버와의 통신 중 에러가 발생했습니다.", Toast.LENGTH_SHORT).show(); }
@Override public void onSuccess(int statusCode, Header[] headers, String responseString) { System.out.println("statusCode : " + statusCode); //System.out.println("responseString : " + responseString); showJSONList(responseString); } }); } |
라이브러리가 모든 폰에서 잘 동작되는지 여부를 확인한 것은 아니라서 표준 HttpUrlConnection 을 이용하여 통신하는 걸 구현하여 사용중이다.
Asynchronous HTTP Client 라이브러리에 대한 내용은 http://link2me.tistory.com/1493 참조하면 된다.
도움이 되셨다면 공감 그리고 ... 클릭 해 주시면 큰 힘이 됩니다.