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 2Phầ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 là “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” và “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ị

1/ Phần mềm XAMPP
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à ApacheMySQL

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

2 thoughts on “Hướng dẫn sử dụng WebService trong Android

Trả lời