Android:Web服务,脱机功能

时间:2016-10-04 13:52:14

标签: android mysql

我发布此问题是因为我在网上找不到任何满意的答案。

我正在开发一个Android应用程序,其中数据从外部服务器(在我的情况下是localhost MySQL服务器)中获取并显示在屏幕上。

然而,对此的限制是该人应始终连接到互联网以获取可在手机上查看的所有数据。

现在,我想要实现的是,一旦从外部服务器检索到数据,它应该存储在设备上,这样即使用户打开了应用程序而没有连接到互联网,数据应该显示给他。

换句话说,我想拥有离线功能。

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

我已经为我的应用实现了相同的功能。看看代码,你会明白如何做到这一点。我也使用过Retrofit。我检查了sharedpreference中的nursejson是否为null。如果它为null,则继续进一步命中API,如果没有则从该共享首选项加载数据。

要刷新列表,只需检查您是否具有互联网连接,然后删除该共享首选项并再次调用getnurse方法。

//After Oncreate
pref = getApplicationContext().getSharedPreferences("CachedResponse", 0);
editor = pref.edit();
editor.apply();
// Call getNurses method
getNurses();



//Method to get Nurses
public void getNurses() {

    nurseJson = pref.getString("nurseJson", null);

    if (nurseJson != null) {

        progressBar.setVisibility(View.INVISIBLE);

        gson = new Gson();
        nurse = gson.fromJson(nurseJson, Nurse.class);
        nurseList = nurse.getNurse();
        namesArrayList.clear();

        for (String nurses : nurseList) {
            namesArrayList.add(nurses);
        }

        namesAdapter.notifyDataSetChanged();

    } else {

        Call<Nurse> call = apiInterface.getNursesList();
        call.enqueue(new Callback<Nurse>() {
            @Override
            public void onResponse(Call<Nurse> call, Response<Nurse> response) {

                progressBar.setVisibility(View.INVISIBLE);

                onItemsLoadComplete();

                if (response.isSuccessful()) {

                    nurse = response.body();

                    nurseJson = new Gson().toJson(nurse);
                    editor.putString("nurseJson", nurseJson);
                    editor.commit();

                    nurseList = nurse.getNurse();

                    namesArrayList.clear();

                    for (String nurses : nurseList) {
                        namesArrayList.add(nurses);
                    }

                    namesAdapter.notifyDataSetChanged();

                } else {

                    utility.createSnackbar(coordinatorLayout, "Error Occurred, Please Try Again Later!");

                }
            }

            @Override
            public void onFailure(Call<Nurse> call, Throwable t) {

                progressBar.setVisibility(View.INVISIBLE);

                onItemsLoadComplete();

                if (t.getLocalizedMessage() != null) {

                    if (t.getLocalizedMessage().contains("Unable to resolve host")) {

                        utility.createSnackbar(coordinatorLayout, "Please Check Internet Connection!");

                    } else {

                        utility.createSnackbar(coordinatorLayout, "Error Occurred, Please Try Again Later!");

                    }

                } else {

                    utility.createSnackbar(coordinatorLayout, "Error Occurred, Please Try Again Later!");

                }
            }
        });

    }

}