Hướng dẫn sử dụng WebService trong Android
Hướng dẫn sử dụng webservice trong android là bài viết tổng hợp cho chủ đề “Kết nối Android với MySQL (Phần 1, Phần 2 và Phần 3) mà chúng tôi đã trình bày ở những bài viết trước.
Trong bài viết này, các bạn sẽ học cách tạo một ứng dụng với 4 chức năng chính sau
- “Thêm mới tài khoản – Thực thi câu lệnh Insert Into”
- “Thay đổi mật khẩu – Thực thi câu lệnh Update”
- “Hiển thị danh sách tài khoản – Thực thi câu lệnh Select”
- “Xóa một tài khoản – Thực thi câu lệnh Delete”.
Hướng dẫn sử dụng webservice trong android – Một số hình ảnh của ứng dụng
Giao diện ứng dụng khi chạy (Hiển thị danh sách tài khoản hiện có)
Menu có 2 lựa chọn: Add Account và Close Application
Thêm mới tài khoản
Thay đổi mật khẩu hoặc Xóa tài khoản
Hướng dẫn sử dụng webservice trong android – Chuẩn bị
2/ Cơ sở dữ liệu
3/ Phần mềm Android Studio
Hướng dẫn sử dụng webservice trong android – Tạo cơ sở dữ liệu
Bước 1. Khởi động XAMPP Control Panel (Sau khi cài đặt XAMPP) -> Start 2 dịch vụ là Apache và MySQL
Bước 2. Truy cập phpMyAdmin , hình bên dưới là kết quả sau khi truy cập phpMyadmin
Bước 3. Chọn SQL và nhập câu lệnh sau
CREATE DATABASE acc_db; USE acc_db; CREATE TABLE acc_tbl (acc_user varchar(50) primary KEY, acc_pwd varchar(50));
Hình bên dưới thể hiện chi tiết các bước thực hiện
Cơ sở dữ liệu sau khi tạo
Hướng dẫn sử dụng webservice trong android – Tạo WebService bằng PHP
1/ Tạo một thư mục ws bên trong htdocs (xampp\htdocs\ws)
2/ Download ws.zip, giải nén và copy những file PHP vào thư mục ws
Hướng dẫn sử dụng webservice trong android – Tạo project
Khởi động Android Studio -> File -> New -> New Project -> Nhập Application name -> Next
Chọn Phone and Tablet, chọn Minimum SDK -> Next
Chọn Empty Activity -> Finish
Hướng dẫn sử dụng webservice trong android – Tạo lớp Accounts
1/ Tạo một Java Class tên Accounts
Chuột phải -> New -> Java Class -> Nhập Name là Accounts -> OK
2/ Nhập code sau
import java.io.Serializable; /** * Created by Le giasutinhoc.vn */ public class Accounts implements Serializable{ String acc_user; String acc_pwd; public Accounts(String acc_user, String acc_pwd) { this.acc_user = acc_user; this.acc_pwd = acc_pwd; } }
Hướng dẫn sử dụng webservice trong android – Tạo lớp ServiceHandling
1/ Khai báo thư viện
Mở build.gradle (Module: app), bổ sung đoạn code sau -> chọn Sync Now
useLibrary 'org.apache.http.legacy'
Quan sát hình để biết cách thực hiện
2/ Tạo một Java Class tên ServiceHandling
/** * Created by giasutinhoc.vn */ public class ServiceHandling { public final static int GET = 1; public final static int POST = 2; public String call(String url, int method, List<NameValuePair> params) { InputStream is = null; String response = null; try { // http client DefaultHttpClient httpClient = new DefaultHttpClient(); HttpEntity httpEntity = null; HttpResponse httpResponse = null; // Kiểm tra loại method là POST hay GET if (method == POST) { HttpPost httpPost = new HttpPost(url); // thêm tham số if (params != null) { httpPost.setEntity(new UrlEncodedFormEntity(params)); } httpResponse = httpClient.execute(httpPost); } else if (method == GET) { // thêm tham số vào url if (params != null) { String paramString = URLEncodedUtils.format(params, "utf-8"); url += "?" + paramString; } HttpGet httpGet = new HttpGet(url); httpResponse = httpClient.execute(httpGet); } httpEntity = httpResponse.getEntity(); is = httpEntity.getContent(); } catch (Exception ex) { Log.d("My error", ex.toString()); } try { BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"), 8); StringBuilder sb = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } is.close(); response = sb.toString(); } catch (Exception e) { Log.e("Buffer Error", "Error: " + e.toString()); } return response; } }
Hướng dẫn sử dụng webservice trong android – Tạo lớp WSHandling
Tạo một Java Class tên WSHandling
/** * Created by giasutinhoc.vn */ public class WSHandling extends AsyncTask<String,Void,ArrayList> { // URL String URL_DISP = "http://10.0.2.2/ws/display.php"; String URL_CREATE = "http://10.0.2.2/ws/create.php"; String URL_UPDATE = "http://10.0.2.2/ws/update.php"; String URL_DELETE = "http://10.0.2.2/ws/delete.php"; ProgressDialog pDialog; ListView lvAccounts; static final String DISPLAY = "display"; static final String CREATE = "create"; static final String UPDATE = "update"; static final String DELETE = "delete"; String acc_user; String acc_pwd; ServiceHandling sh = new ServiceHandling(); Context context; ArrayList<Accounts> al; public WSHandling(Context context, ListView lvAccounts){ this.context = context; this.lvAccounts = lvAccounts; } public WSHandling(Context context, String acc_user, String acc_pwd) { this.context = context; this.acc_user = acc_user; this.acc_pwd = acc_pwd; } @Override protected ArrayList doInBackground(String... params) { switch (params[0]) { case DISPLAY: break; case CREATE: break; case UPDATE: break; case DELETE: break; } return al; } protected void onPreExecute() { super.onPreExecute(); pDialog = new ProgressDialog(context); pDialog.setMessage("Proccesing.."); pDialog.setCancelable(false); pDialog.show(); } @Override protected void onPostExecute(ArrayList ret) { super.onPostExecute(ret); if (pDialog.isShowing()) pDialog.dismiss(); loadData(); } private void loadData() { if (al == null) { return; } List<String> data = new ArrayList<String>(); for (int i = 0; i < al.size(); i++) { Accounts acc = al.get(i); data.add(acc.acc_user + ": " + acc.acc_pwd); } // Tạo adapter cho listivew ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1, data); // Gắn adapter cho listview lvAccounts.setAdapter(adapter); } public ArrayList<Accounts> getData() { return al; } }
Code đầy đủ của lớp WSHandling
Hướng dẫn sử dụng webservice trong android – Tạo AccountsActivity
1/ Tạo Activity: Chuột phải -> New -> Activity -> Empty Activity
Activity Name là AccountsActivity -> Finish
2/ Thiết kế layout
3/ Viết xử lý
public class AccountsActivity extends AppCompatActivity { EditText txtAccUser, txtAccPwd; boolean isUpdate; Accounts accounts; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_accounts); txtAccUser = (EditText) findViewById(R.id.txtAccUser); txtAccPwd = (EditText) findViewById(R.id.txtAccPwd); isUpdate = false; Intent i = getIntent(); Bundle b = i.getBundleExtra("mode"); if (b != null) { isUpdate = b.getBoolean("mode_update"); if (isUpdate) { accounts = (Accounts) b.getSerializable("data"); txtAccUser.setText(accounts.acc_user); txtAccUser.setEnabled(false); txtAccPwd.setText(accounts.acc_pwd); } } } public void save(View view) { if (!isUpdate) { String accUser = txtAccUser.getText().toString(); String accPwd = txtAccPwd.getText().toString(); txtAccUser.setEnabled(true); new WSHandling(AccountsActivity.this, accUser, accPwd).execute(WSHandling.CREATE); Toast.makeText(this, "Successfull", Toast.LENGTH_SHORT).show(); } else { String accPwd = txtAccPwd.getText().toString(); new WSHandling(AccountsActivity.this, accounts.acc_user, accPwd).execute(WSHandling.UPDATE); Toast.makeText(this, "Successfull", Toast.LENGTH_SHORT).show(); } switch (view.getId()) { case R.id.btnSave_Exit: finish(); } } }
Hướng dẫn sử dụng webservice trong android – MainActivity
1/ Thiết kế layout
2/ Thiết kế menu
Bước 1. Tạo thư mục menu
Chuột phải res -> New -> Directory
Nhập directory name là menu -> OK
Bước 2. Thiết kế Option Menu
Chuột phải menu -> New -> Menu resource file
Nhập File name là option_menu -> OK
Nhập code sau
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/m_add" android:title="Add Account"/> <item android:id="@+id/m_exit" android:title="Close Application"/> </menu>
Bước 3. Thiết kế Context Menu
Chuột phải menu -> New -> Menu resource file -> Nhập File name là context_menu -> OK
Nhập code sau
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/m_change" android:title="Change Password"/> <item android:id="@+id/m_delete" android:title="Delete Account"/> </menu>
3/ Viết xử lý cho MainActivity
public class MainActivity extends AppCompatActivity { ListView lvAccounts; ArrayList<Accounts> al; ServiceHandling sh; int position; WSHandling wsh; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); sh = new ServiceHandling(); lvAccounts = (ListView) findViewById(R.id.lvAccounts); lvAccounts.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) { position = i; return false; } }); loadData(); registerForContextMenu(lvAccounts); } private void loadData() { wsh = new WSHandling(MainActivity.this, lvAccounts); wsh.execute(WSHandling.DISPLAY); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.option_menu, menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); switch (id) { case R.id.m_add: Intent i = new Intent(this, AccountsActivity.class); startActivity(i); break; case R.id.m_exit: finish(); } return super.onOptionsItemSelected(item); } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { getMenuInflater().inflate(R.menu.context_menu, menu); super.onCreateContextMenu(menu, v, menuInfo); } @Override public boolean onContextItemSelected(MenuItem item) { int id = item.getItemId(); switch (id) { case R.id.m_change: Intent i = new Intent(this, AccountsActivity.class); Bundle b = new Bundle(); b.putBoolean("mode_update", true); al = wsh.getData(); b.putSerializable("data", al.get(position)); i.putExtra("mode", b); startActivity(i); break; case R.id.m_delete: al = wsh.getData(); Accounts accounts = al.get(position); new WSHandling(MainActivity.this, accounts.acc_user, accounts.acc_pwd).execute(WSHandling.DELETE); loadData(); break; } return super.onContextItemSelected(item); } @Override protected void onRestart() { super.onRestart(); loadData(); } }