Header Ads

[Android] Chương trình đọc 1 file JSON từ server và phân tích dữ liệu để hiển thị

Bài 1: Viết chương trình đọc 1 file JSON từ server và phân tích dữ liệu để hiển thị.

      1.       Chép file “contacts” lên localhost. (sử dụng Appserv  xem hướng dẫn cài đặt tại đây)
      2.       Tạo project (version 1.6), đặt tên “docfilejson1”. 
      3.       Mở file “manifest” thêm dòng phân quyền như sau:
    <uses-permission android:name="android.permission.INTERNET"/>
      4.       Để thuận tiện ta sẽ tạo ra 1 class mới phục vụ cho việc đọc json. Tạo class mới đặt tên vd: “JSONParser.java”.  Trong class vừa tạo khai báo cá biến toàn cục:
          InputStream is=null;
          JSONObject jobj=null;
          String json
      5.       Tiếp theo ta xây dựng hàm tên getJSONFromUrl. Hàm này nhận vào một chuỗi là đường dẫn dẫn đến file json trên server. Nó sẽ trả về chuỗi json.
          public JSONObject getJSONFromUrl(String url)
          {
                 try{
                        //khoi tao
                        DefaultHttpClient client=new DefaultHttpClient();
                        HttpPost httppost=new HttpPost(url);
                       
                        //thuc thi , lay ve noi dung
                        HttpResponse httpresponse=client.execute(httppost);
                        HttpEntity httpentity=httpresponse.getEntity();
                        is=httpentity.getContent();
                       
                        //doc du lieu
                        BufferedReader reader=
                                      new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
                        StringBuilder sb=new StringBuilder();
                        String line=null;
                        while((line=reader.readLine())!=null)
                        {
                               sb.append(line+"\n");
                        }
                        is.close();
                        json=sb.toString(); //doc StringBuilder vao chuoi
                       
                        jobj=new JSONObject(json); //dua chuoi vao doi tuong json
                       
                 }catch(Exception e)
                 {
                        Log.d("loi", e.toString());
                 }
                 return jobj;
          }
         6.       Trở về file java chính. Khởi tạo 1 số biến toàn cục trong class như sau:
   private static String url = "http://10.0.2.2:8080/testandroid/contacts";
    
   // JSON Node names
   private static final String TAG_CONTACTS = "contacts";
   private static final String TAG_ID = "id";
   private static final String TAG_NAME = "name";
   private static final String TAG_EMAIL = "email";
   private static final String TAG_ADDRESS = "address";
   private static final String TAG_GENDER = "gender";
   private static final String TAG_PHONE = "phone";
   private static final String TAG_PHONE_MOBILE = "mobile";
   private static final String TAG_PHONE_HOME = "home";
   private static final String TAG_PHONE_OFFICE = "office";
    
   // contacts JSONArray
   JSONArray contacts = null;
  
        7.       Trong hàm onCreate ta khởi tạo đối tượng JSONParser (đã viết class ở trên) sau đó dùng hàm getJSONFromUrl để lấy về chuỗi json. Sau đó ta tạo mảng chứa các contact. Dùng for để duyệt tất cả các phần tử contact. Tương ứng mỗi phần tử trong mảng contact ta tạo ra đối tượng JSONObject rồi dùng hàm getString để lấy dữ liệu ra. Lưu ý: Đối với “phone” nó lại là một object chứa các phần tử con là “mobile”, “home”, “office” nên ta phải lấy ra đối tượng JSONObject “phone” sau đó mới lấy tiếp dữ liệu con từ nó.
        JSONParser jsonparse=new JSONParser();
        //lay doi tuong json
        JSONObject jsonobject=jsonparse.getJSONFromUrl(url);
       
        try{
          //tao mang contacts
          contacts=jsonobject.getJSONArray(TAG_CONTACTS);
         
          //duyet tung contacts
          for(int i=0;i<contacts.length();i++)
          {
                 //lay ra mot doi tuong contact
                 JSONObject onecontact=contacts.getJSONObject(i);
                
                 //lay du lieu
                 String id=onecontact.getString(TAG_ID);
                 String name=onecontact.getString(TAG_NAME);
                 String email=onecontact.getString(TAG_EMAIL);
                 String address=onecontact.getString(TAG_ADDRESS);
                 String gender=onecontact.getString(TAG_GENDER);
                
                 //so phone la la json Object
                 JSONObject phone=onecontact.getJSONObject(TAG_PHONE);
                 String mobile=phone.getString(TAG_PHONE_MOBILE);
                 String home=phone.getString(TAG_PHONE_HOME);
                 String office=phone.getString(TAG_PHONE_OFFICE);
         
                 Log.d("dulieu","id: "+id +" name:"+name+" phone:"+phone);
          }
         
        }catch(Exception e)
        {
          Log.d("loi",e.toString());
        }
       
    }
        8.       Chạy và xem kết quả trong Logcat để thấy dữ liệu JSON đã được phân tích.

Bài 2: Update bài 1 lên version cao hơn, đưa dữ liệu vào ListView (dùng AsyncTask).

Hướng dẫn.
      1.       Nâng cấp version lên vd: 4.0.3. Tự làm nhé.
      2.       Trên giao diện chính kéo vào 1 ListView.
      3.       Tạo ra 1 layout mới đặt tên “listviewlayout.xml”.  Kéo vào 5 TextView đặt tên tuần tự là “name”,”email”,  “mobile”, “home”, “office”.
        4.       Trong file java chính khai báo ListView và ánh xạ nó. Khai báo thêm một ArrayList chứa các HashMap
   ListView lv;
   ArrayList<HashMap<String,String>> contactlist= new ArrayList<HashMap<String,String>>();

       5.       Xây dựng 1 class trong file java chính (chú ý: AsycnTask phải là subclass) tên ChayNenLayJson kế thừa từ AsyncTask. Override lên 2 hàm là doInBackGround và onPostExecute.
    class ChayNenLayJson extends AsyncTask<Void,Void,Void>
    {
          @Override
          protected Void doInBackground(Void... arg0) {
                 // TODO Auto-generated method stub
                 return null;
          }
          @Override
          protected void onPostExecute(Void result) {
                 // TODO Auto-generated method stub
                 super.onPostExecute(result);
          }
    }
        6.       Trong hàm onCreate viết lệnh để chạy AsyncTask
        new ChayNenLayJson().execute();

        7.       Cut toàn bộ đoạn truy xuất JSON và paste vào hàm doInBackGround. Sau lệnh in ra Logcat thêm lệnh để tạo đối tượng HashMap, lấy các dữ liệu bỏ vào HashMap cuối cùng add HashMap vào ArrayList. Đến đây ta đã có 1 ArrayList chứa tập hợp các dữ liệu đã phân tích được từ Json.
JSONParser jsonparse=new JSONParser();
    //lay doi tuong json
    JSONObject jsonobject=jsonparse.getJSONFromUrl(url);
    try{
          //tao mang contacts
          contacts=jsonobject.getJSONArray(TAG_CONTACTS);
          //duyet tung contacts
          for(int i=0;i<contacts.length();i++)
          {
                 …………………………………………………….
                 String office=phone.getString(TAG_PHONE_OFFICE);
         
                 Log.d("dulieu","id: "+id +" name:"+name+" phone:"+phone);
                 HashMap<String,String> map=new HashMap<String,String>();
                 map.put(TAG_ID, id);
                 map.put(TAG_NAME, name);
                 map.put(TAG_EMAIL,email);
                 map.put(TAG_ADDRESS,address);
                 map.put(TAG_GENDER,gender);
                 map.put(TAG_PHONE_MOBILE,mobile);
                 map.put(TAG_PHONE_HOME,home);
                 map.put(TAG_PHONE_OFFICE,office);
                
                 contactlist.add(map);
          }
         
    }catch(Exception e)
    {
          Log.d("loi",e.toString());
    }
         8.       Trong hàm onPostExecute viết thêm lệnh để lấy dữ liệu từ ArrayList và đổ lên ListView.
ListAdapter adapter=new SimpleAdapter(getApplicationContext(),
          contactlist,
          R.layout.listview_layout,
          new String[]{TAG_NAME,TAG_EMAIL,TAG_PHONE_MOBILE,TAG_PHONE_HOME,TAG_PHONE_OFFICE},
          new int[]{R.id.name,R.id.email,R.id.mobile,R.id.home,R.id.office});
lv.setAdapter(adapter);
         9.       Cuối cùng trong hàm onCreate bắt sự kiện khi một mục trong ListView được chọn
 lv.setOnItemClickListener(new OnItemClickListener() {

    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                  long arg3) {
           // TODO Auto-generated method stub
           String name=((TextView)arg1.findViewById(R.id.name)).getText().toString();
           Toast.makeText(getApplicationContext(),"ban chon "+name, Toast.LENGTH_SHORT).show();
    }
});
         10.   Chạy chương trình để thấy dữ liệu đã được đổ lên ListView. Click vào một mục trên ListView để thấy Toast.

Bài 3: Sửa bài 2 và dùng Handler để điều khiển Thread và update UI. Có thể phát triển thêm để khi click vào một mục trên ListView sẽ mở Activity mới và truyền dữ liệu qua.

No comments:

Powered by Blogger.