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();
}
}






















