Study/Android

DB에서 데이터를 가져와서 게시판 읽는 어플 제작

Kostrian 2015. 1. 29. 11:32

내가 만든 홈페이지 게시판을 안드로이드에서 확인할 수 있게 만들어 보았다.


먼저 전에 해본 JSON형식으로 만든 데이터를 PHP를 통해 가져오고 이를 안드로이드에서 해석을 하였다.


일단 PHP가 갱신되었을때 즉, DB가 변동되었을 때, 이를 캐치해서 리스트뷰를 갱신하는것은 생각하지 않고 만들어 보았다. 그렇기에 일단 doInBackgroumd에서 데이터를 받아오고 onPostExecute에서 데이터를 해석하고 어뎁터에 데이터를 추가해주었다. 아래 코드는 onPostExecuted이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
protected void onPostExecute(String str) {
    try {
        JSONObject jObject = new JSONObject(str);
        JSONArray resultsBbs = jObject.getJSONArray("ap_bbs");
        // bbs테이블에는 member_idx밖에 없으므로 id를 가져오기 위해서 member테이블을 가져와서 전역변수에 저장
        resultsMember = jObject.getJSONArray("ap_member");
 
        if (jObject.get("status").equals("OK")) {
            int numOfRow = Integer.parseInt((String) jObject
                    .get("ap_bbs_num_result"));
            for (int i = 0; i < numOfRow; ++i) {
                JSONObject temp = resultsBbs.getJSONObject(i);
                // PHP에서 읽어온 글 정보를 리스트뷰 아이템에 넣어준다.
                boardAdapter.addItem(
                        Integer.parseInt((String) temp.get("doc_idx")),
                        Integer.parseInt((String) temp.get("member_idx")),
                        (String) temp.get("subject"),
                        (String) temp.get("content"),
                        Long.parseLong((String) temp.get("reg_date")));
            }
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
 
}
cs


이렇게 하면 리스트뷰에서 프로그램을 시작한 순간 존재하는 글만을 읽어와서 보여준다. 하지만 게시판은 언제 글이 생길지, 또 언제 글이 삭제될지 모르기때문에 수동으로 새로고침을 해주거나 아니면 자동으로 일정 시간마다 새로고침을 해서 보여줘야 한다. 하지만 이러한 기능을 넣기위한 정석적인 방법을 찾지 못하였다. 그래서 약간 비효율적인 방법으로 일단 만들었다.


doInBackground에서 정보를 받아오는 부분을 while로 루프를 돌리고 이때 가져온 정보를 onProgressUpdate에서 처리하도록 하였다. 수정된 코드는 아래와 같다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
protected String doInBackground(String... params) {
 
    StringBuilder jsonHtml;
    while (true) {
        try {
 
            jsonHtml = new StringBuilder();
            URL phpUrl = new URL(params[0]);
            HttpURLConnection conn = (HttpURLConnection) phpUrl
                    .openConnection();
 
            if (conn != null) {
                conn.setConnectTimeout(10000);
                conn.setUseCaches(false);
 
                if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
                    BufferedReader br = new BufferedReader(
                            new InputStreamReader(conn.getInputStream(),
                                    "UTF-8"));
                    while (true) {
                        String line = br.readLine();
                        if (line == null)
                            break;
                        jsonHtml.append(line + "\n");
                    }
                    br.close();
                }
                conn.disconnect();
            }
            if (isCancelled()) {
                break;
            }
            publishProgress(jsonHtml);
            SystemClock.sleep(10000);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    return jsonHtml.toString();
}
cs


그리고 메서드 2개를 추가하였다. publishProgress와 onPostExecute를 오버로드, 오버라이드 하였다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
protected void publishProgress(StringBuilder str) {
    // 일단 쓰레드가 실행되고 있을때 실행될수 있는 메서드이기에 오버라이딩 하여 onProgressUpdate를 실행하도록 하였다.
    onProgressUpdate(str.toString());
}
 
protected void onProgressUpdate(String str) {
    // 여기에서 onPostExecute가 하였던 일을 대신하도록 하였다.
    try {
        JSONObject jObject = new JSONObject(str);
        JSONArray resultsBbs = jObject.getJSONArray("ap_bbs");
        resultsMember = jObject.getJSONArray("ap_member");
        boardAdapter.itemList.clear();
 
        if (jObject.get("status").equals("OK")) {
            int numOfRow = Integer.parseInt((String) jObject
                    .get("ap_bbs_num_result"));
            for (int i = 0; i < numOfRow; ++i) {
                JSONObject temp = resultsBbs.getJSONObject(i);
                boardAdapter.addItem(
                        Integer.parseInt((String) temp.get("doc_idx")),
                        Integer.parseInt((String) temp.get("member_idx")),
                        (String) temp.get("subject"),
                        (String) temp.get("content"),
                        Long.parseLong((String) temp.get("reg_date")));
            }
        }
        boardAdapter.dataChange();
    } catch (JSONException e) {
        e.printStackTrace();
    }
}
cs


이렇게 하니 일단 새로고침 기능은 한다. 하지만 아직 완벽하지는 않아 좀더 연구를 해봐야 겠다.

'Study > Android' 카테고리의 다른 글

Fragment  (0) 2015.01.29
MYSQL에서 안드로이드로 데이터 가져오기  (0) 2015.01.29
CheckBox & 갤러리 사진 선택  (0) 2015.01.29
Intent & SQLite  (0) 2015.01.29
Custom ListView  (0) 2015.01.29