Day 26 - [Android APP] 04-MVVM - Repository与API串接

前几天介绍的 MVVM 架构,可以参考这篇 [[Android APP] 01-架构介绍-MVVM]。今天要讲的是其中 Repository 的部分,Repository 通常用来提供资料,因为我的资料来源只有 API,就不那麽复杂了,直接在 Repository 串接 API。

本系统中有 2 个 Repository、3 支 API,这次以 JSON 结构比较简单的 CategoryRepository 来作范例。

CategoryRepository

我在这边用的是 Volley,当然你想用 Retrofit 或其他的 http client 也都可以。
关於 Volley 的使用可以参考我之前的文章: [Workshop记录-Volley与API]

完整程序码: https://gitlab.com/graduate_lab415/chatbot/-/blob/master/app/src/main/java/com/cmrdb/app/chatbot/repository/CategoryRepository.java

public void get(CategoryVolleyCallback callback) {
    StringRequest stringRequest = new StringRequest(Request.Method.GET,
            "http://120.110.112.177:83/Chatbot/getCategories.php",
            response -> {
                Log.d(TAG, "onResponse: " + response);
                ArrayList<Category> categoryList = new ArrayList<>();
                try {
                    JSONObject json = new JSONObject(response);
                    JSONArray categories = json.getJSONArray("categories");

                    for (int i = 0; i < categories.length(); i++) {
                        JSONObject category = categories.getJSONObject(i);
                        categoryList.add(new Category(
                                category.getString("id"),
                                category.getString("name")));
                    }

                    callback.onSuccess(categoryList);
                } catch (JSONException e) {
                    callback.onFail("发生一些错误\n" + e.getLocalizedMessage());
                }

            },
            error -> {
                Log.e(TAG, "onErrorResponse: ", error);
                callback.onFail("发生一些错误\n" + error.toString());
            });
    mRQ.add(stringRequest);
}

因为从 API 取得资料是非同步运行的,所以参数中有个 Callback。Callback 的用意就是,当资料都收到之後,再透过 callback.onSuccess(categoryList); 回传给 ViewModel。如果不是使用 Callback 而是直接 return categoryList; 的话,会造成物件回传了,但物件里还是空的、ViewModel 没有拿到资料的状况。了解 Callback 的概念是很重要的哦!!

资料提供流程

flow



<<:  视觉化KBARS(3)-service、serviceImpl

>>:  那些被忽略但很好用的 Web API / Drag & Drop

新零售行销模式案例,全通路时代来临该如何布局

新零售行销模式案例,全通路时代来临该如何布局,一直以来都在担任辅导顾问为中小企业解决网路行销问题但都...

Day06 - this&Object Prototypes Ch3 Objects - Contents - Property Descriptors

透过 Object.defineProperty 可以设定 value writable 值可修改性...

Day23 - 在 XState 中的平行式状态 Parallel States

还记得我们在 Day 13 的例子吗? 有个 Input 的 UI 元件,且它有以下 [Invali...

[Day 31] 番外篇─如何将OV7670 + BLE Sense连到Edge Impulse取像

虽然铁人赛已暂告一个段落,但在[Day 27] Edge Impulse + BLE Sense实现...

Day25 ATT&CK for ICS - Collection(1)

Collection 攻击者会为了取得 ICS 环境中感兴趣的资料,进而使用许多技巧,透过监控的方式...