728x90

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 참조하면 된다.


도움이 되셨다면 공감 그리고 ... 클릭 해 주시면 큰 힘이 됩니다.

블로그 이미지

Link2Me

,